当我们将一个方法存储在一个变量中,然后调用它时,为什么上下文对象会变为全局窗口对象
When we store a method in a variable and then call it, Why does the context object change to the global window object?
以下示例取自jqfundmentals,
var person = {
firstName : 'Boaz',
lastName : 'Sender',
greet : function() {
log( 'Hi, ' + this.firstName );
}
};
var sayIt = person.greet; // store the method in a variable
sayIt(); // logs 'Hi, undefined' -- uh-oh
作为解释,
当我们将.geet()方法存储在变量sayIt中,然后调用sayIt()时,上下文对象将变为全局窗口对象,而不是person对象。由于窗口对象没有属性firstName,当我们试图访问它时,我们会得到未定义
我的问题是
当我们将.geet()方法存储在变量sayIt中,然后调用sayIt()时,为什么上下文对象变为全局窗口对象?
这是规范,请参阅ecma-262/5.1/#sec-10.4.3
控制进入执行时执行以下步骤函数对象F(调用方)中包含的函数代码的上下文提供了thisArg,调用方提供了argumentsList:
- 如果函数代码为严格代码,请将ThisBinding设置为thisArg
- 否则,如果thisArg为null或未定义,则将ThisBinding设置为全局对象
因此,当处于严格模式时,this
将引用undefined
,否则将引用全局对象。
上下文对象更改为全局窗口,因为您没有任何上下文,默认情况下,当没有分配上下文时,"this"指的是窗口对象。
您可以在此链接中看到解释:http://www.laurencegellert.com/2012/03/javascript-the-good-parts-review/
关键字"new"的行为复杂且不明显。创建对象/函数时,添加新关键字会更改"this"的含义。当添加"new"时,"this"指的是对象,这是有意义的。然而,在下一个代码块中,省略了"new","this"指的是全局Window对象!代码示例显示了如何污染全局对象。小心"这个"。
相关文章:
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 对一个对象使用reduce可以返回一个没有't在数组中包含目标字母
- AngularJS&JSON-从Previous&下一个对象
- jQuery$.inArray()总是返回-1和一个对象数组
- javascript处理一个对象数组以获得一个新的对象数组
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 你能用来自数组的属性名称生成一个对象吗
- 预期响应包含一个对象,但在angular js中得到一个数组错误
- Protractor:element.getText()返回一个对象,而不是String
- 如何使用jQuery添加另一个对象的高度作为边距
- 计算从一个对象到另一个对象的路径并沿其移动
- 如何将一个对象添加到每个对象数组中
- 为了避免创建全局变量,可以将所有变量分配给一个对象吗
- 将javascript对象(属性+值)合并到一个对象中
- 尝试简化检查对象键是否为true并将其推送到另一个对象
- 从 javascript 中的对象方法返回一个对象
- 响应应包含一个对象,但得到的却是GET操作的数组
- js:如何制作一个循环,将20个不同的东西添加到一个对象中
- 用javascript创建另一个对象的实例