gpt4 book ai didi

调用函数和创建函数实例之间的Javascript区别

转载 作者:可可西里 更新时间:2023-11-01 01:38:50 25 4
gpt4 key购买 nike

我试图理解为什么在直接调用外部函数时内部函数可以访问外部函数的公共(public)属性,但在将其分配给变量时却不能?

例子:

function outer(x,y){

this.x = x;
this.y = y;

function inner(){
alert(this.x);
}

inner();
}

outer(1,2); //As expected, alerts 1
var func = outer(1,2) //Also alert 1
var func2 = new outer(1,2); //Alerts undefined

我尝试的一件事是从 alert(this.x); 中删除 this 关键字,它对所有三种情况都有效。但是,如果我确实删除了 this 关键字,我将访问传入的参数,而不是公共(public)变量,这绝对不是所需的操作。有人可以解释这种行为吗?

最佳答案

当你这样调用 outer(1, 2) 时,this 是对 window 的引用,所以“x”和“y” "是有效的全局变量。这就是 inner() 可以访问“x”的原因。

当您调用 new outer(1, 2) 时,您已使 this(在“outer”中)成为对新对象的引用。当在“outer”内部调用“inner”时,this 仍将引用 window,因此没有“x”。

this 的值是为每个 函数调用确定的,并且该值仅取决于该调用的细节。因此,您通过 new 调用“outer”这一事实对内部调用“inner”没有影响——因为您只是将函数调用为 inner();,该函数内 this 的值将是对 window 的引用(好吧,全局上下文,不管它是什么)。

以下是调用函数时可以设置 this 的方法:

  1. 如果通过new 运算符调用函数,则this 将引用新创建的对象。
  2. 如果对函数的引用是通过对象的属性查找 (foo.someFunction()) 获得的,则 this 将是对该对象的引用。
  3. 如果函数是通过函数原型(prototype)中的 .call().apply() 调用的,则 this 将引用使用这些函数中的任何一个的第一个参数,必要时强制转换为对象值。
  4. 如果通过简单的“裸”引用调用函数,则this 将引用全局上下文(浏览器中的window)。 edit — Šime Vidas 在上面的评论中指出,在严格模式下,这种情况导致 thisnull(这确实使更多感,并会避免在 OP 中观察到的怪异现象)。

关于调用函数和创建函数实例之间的Javascript区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12092542/

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