Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么没有’;t匿名函数拾取包含范围’;这个物体是什么?_Javascript - Fatal编程技术网

Javascript 为什么没有’;t匿名函数拾取包含范围’;这个物体是什么?

Javascript 为什么没有’;t匿名函数拾取包含范围’;这个物体是什么?,javascript,Javascript,我在一本关于闭包的教科书中看到了下面的代码: var name = "The Window"; var object = { name: "My Object", getNameFunc: function () { return function () { return this.name; }; } }; alert(object.getNameFunc()()); // "The Window" 详细解释为什么内部函数中的this对象不能访问对

我在一本关于闭包的教科书中看到了下面的代码:

var name = "The Window";

var object = {
  name: "My Object",
  getNameFunc: function () {
    return function () {
      return this.name;
    };
  }
};

alert(object.getNameFunc()()); // "The Window"
详细解释为什么内部函数中的this对象不能访问对象范围,而是访问全局范围可能会有很大帮助


感谢您的帮助。

将其分解为单独的函数调用。而不是

 object.getNameFunc()()
让我们将其分解,调用第一个函数,然后调用该函数的结果

 var theFunc = object.getNameFunc(); // invocation 1
 theFunc();   // invocation 2
在调用1中,我们调用getNameFunc(),并指定一个上下文(在前面有一些内容),因此在该调用中,“this”有一个指定的值,object

在第二种情况下,我们调用函数“bare”,没有指定的上下文,因此我们有全局上下文。

getNameFunc()
中,
指的是
对象
。它返回一个函数,该函数不绑定到上下文,只绑定到包含范围。上下文(此所指的内容)不是继承的(尽管范围是继承的)

内部函数不插入定义它们的上下文,尽管它们继承定义它们的范围

解决此问题的一种方法是将返回的函数
.bind()
绑定到上下文:

getNameFunc: function () {
  return function () {
    return this.name;
  }.bind(this);
}

在Javascript中,每个函数调用都会导致设置一个新值
this
,如果它只是一个普通函数调用,则
this
会被设置为全局对象(在浏览器中是
窗口
)或
未定义的
(如果在严格模式下运行)。这就是发生在你身上的事情。在这方面:

object.getNameFunc()()
object.getNameFunc()
进行第一次方法调用并返回内部匿名函数。然后,最后一个
()
只是该函数的常规函数调用,该常规函数调用导致
this
设置为全局对象(
window
)。任何普通函数调用都会将
的值重置为
窗口
未定义
。这就是Javascript的工作原理

下面是一个简单的演示,向您展示如何重置此:

有关控制此值的五种方法,请参阅

通过在父函数中保存
this
的值或使用其中一种方法显式控制
this
的值,可以通过多种方式解决此问题

要理解的一个更简单的机制是只在父函数中保存所需的值:

var myName=“窗口”;
变量对象={
myName:“我的对象”,
getNameFunc:函数(){
var self=这个;
返回函数(){
返回self.myName;
};
}
};

document.write(object.getNameFunc()());//“我的对象”
@JamesDonnelly,我在编辑中修复了它们。本质上,在javascript中,一切都是一个对象,甚至是一个函数。因此,当您创建匿名函数时,它是一个对象,因此有一个this指针。处理这个问题的标准方法是在函数前面声明一个变量,比如var self=this,然后使用它guys@andy@Javascript中的michaelEVERY函数调用根据函数的调用方式设置一个新值
this
的值从一个函数调用到下一个函数调用不会自动保留。查看
this
的值得到控制的5种方式。这就是为什么,但我想知道为什么this对象在匿名函数中发生变化。这是什么原因?@nurdyguy@jfriend00不明白你的意思。。。。你是说变量对象或词法上下文不是继承的吗?