js函数中声明的变量和未声明的变量

declared vs undeclared variables in a js function

本文关键字:变量 未声明 声明 函数 js      更新时间:2023-09-26

在下面这段代码中(摘自"Secrets of the JavaScript Ninja"的一个函数的简短版本),我不理解"初始化"变量在声明时和未声明时的行为。

如果我声明了它,那么它的值总是假的。我注意到的另一件事是,变量声明的方式只有在proto = new this()时才相关,如果proto = new Class(),则"initialize"变量具有可预测的行为。有人能好心地给我解释一下这种行为的动力吗?

Object.subClass = function(properties) {
  initializing = true;
  var proto = new this();
  initializing = false;
  function Class() {
    console.log(initializing)
  }
  Class.prototype = proto;
  Class.constructor = Class;
  Class.subClass = arguments.callee;
  return Class;
};
var Constructor = Object.subClass()
var subConstructor = Constructor.subClass() // true
var instance = new subConstructor() // false
// if var  initializing = true;
var proto = new this();
initializing = false;
var Constructor = Object.subClass()
var subConstructor = Constructor.subClass() // false
var instance = new subConstructor() // false

谢谢你的回复,我很抱歉没有把我的意思表达清楚。这里是另一个尝试:

 Object.subClass = function(properties) {
    initializing = true;
    var proto = new this();
    initializing = false;
    function Class() {
        console.log(initializing)
    }
    Class.prototype = proto;
    Class.constructor = Class;
    Class.subClass = arguments.callee;
    return Class;
};
 var Constructor = Object.subClass()
 var subConstructor = Constructor.subClass() // true
 var instance = new subConstructor() // false
 Object.subClass = function(properties) {
   var initializing = true;
   var proto = new this();
       initializing = false;
    function Class() {
        console.log(initializing)
    }
    Class.prototype = proto;
    Class.constructor = Class;
    Class.subClass = arguments.callee;
    return Class;
};
 var Constructor = Object.subClass()
 var subConstructor = Constructor.subClass() // false
 var instance = new subConstructor() // false

我知道这是一种糟糕的方式来实现基于原型的编程,我的问题源于初始化变量的行为。

可以在Object的第一个例子中看到。子类,未声明的"初始化"变量,当调用时,根据调用的上下文返回true或false

在Object的第二个例子中。子类,声明的'初始化'变量,当调用时,只返回false,而不管调用的上下文。