gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:26:38 26 4
gpt4 key购买 nike

这些有什么区别?

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com