javascript - 在 Javascript 中使用 var 和 this 有什么区别?

标签 javascript variable-declaration

这些有什么区别?

var a = 13;  
this.b = 21;  
document.write(a);  
document.write(b);

最佳答案

对于全局代码(不属于任何函数的代码),它们几乎是等价的,都在最后创建全局对象的属性。

区别在于a,它已经用var语句声明,Variable Instantiation进程将使用全局对象作为可变对象 (1),并将该属性定义为不可删除,例如:

var a = 13;
delete a; // false
typeof a; // "number"

然后,b 因为全局代码中的 this 值,指向全局对象本身,也将是一个全局属性,但是这个可以删除:

this.b = 21;
delete b; // true
typeof b; // "undefined"

不要在 Firebug 中尝试第一个片段,因为 Firebug 的控制台在内部使用 eval 运行代码,并且在此执行上下文中变量实例化过程的行为不同,您可以尝试here .

(1) 变量对象 (VO) 是变量实例化过程用来定义 FunctionDeclarations 标识符的对象,标识符是用 var 语句声明的, 和函数形式参数的标识符,在不同的 execution contexts ,所有这些标识符都绑定(bind)为 VO 的属性,作用域链由 VO 的列表组成。

对于全局代码,VO 是全局对象本身,这就是为什么 a 最终成为它的一个属性。对于函数代码,VO(也称为 FunctionCode 的 Activation Object)是调用函数时在幕后创建的新对象,这就是创建新词法作用域的原因,简而言之,我将讨论功能。

athis.b 都可以是resolved就像 ab 一样,因为作用域链中的第一个对象又是全局对象。

另外,我认为知道变量实例化过程发生在代码执行之前是有效的,例如:

alert(a); // undefined, it exists but has no value assigned to it yet
alert(b); // ReferenceError is thrown

var a = 13;
this.b = 21;

这些差异可能微不足道,但我认为值得了解。

现在,如果您发布的代码片段在一个函数内,则完全不同

在您的示例中使用 var 语句声明的 a 标识符将是一个局部变量,仅可用于函数(以及任何嵌套函数)。

请记住,在 JavaScript block 中不会引入新范围,只有函数会引入新范围,并且要在该范围内声明变量,您应该始终使用 var .

this.b 标识符将成为绑定(bind)到由 this 值引用的对象的属性,但是... 什么是 ???

JavaScript 中的 this 值是在您调用函数时隐式设置的,它取决于您如何调用它:

  1. 当您使用new 运算符时,函数内的this 值将指向新创建的对象,例如:

    function Test() {
      this.foo = "bar";
    }
    var obj = new Test(); // a new object with a `foo` property
    
  2. 当您调用作为对象成员 的函数时,该函数内的this 值将指向基对象,例如:

    var obj = {
      foo: function () {
        return this == obj;
      }
    };
    obj.foo(); // true
    
  3. 当您在没有任何基础对象的情况下调用函数时,this 值将引用全局对象:

    function test() {
      return this == window;
    }
    test(); // true
    
  4. 当您使用 call 调用函数时,可以显式设置 this 值或 apply :

    function test() {
      alert(this);
    }
    test.call("hello world!"); // alerts "hello world!"
    

关于javascript - 在 Javascript 中使用 var 和 this 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3116109/

相关文章:

javascript - Javascript 中按背景颜色排列的元素数组

javascript - 在圆圈周围绘制形状

javascript - 防止表单在 jQuery Validate 插件的 submitHandler 函数中提交

c - 在 C 中声明和分配具有文件作用域的变量

variables - 在 Go var 声明中显式提供类型失败,而隐式工作

javascript - 从 AudioData/Web Audio API 获取所有样本

javascript - bootstrap 模式中的启动 timeCircles 插件

java - 将静态变量存储在临时变量中

c#变量使用

c++ - 在声明时对全局变量进行值初始化