我知道在编译阶段会提升吊装,变量和功能的一般规则。 因此,任何写作如下
var foo = 'global';
将编译为,
var foo; //undefined
foo = 'global'; // declared
但这是我无法理解的
var foo = 'global';
var myObject = {
foo: 'local',
func: function(){
console.log(this.foo); // local
(function(){
console.log(this.foo); // global
})();
}
}
myObject.func();
为什么myObect中的自调用函数打印全局foo /获取窗口的上下文?。
一般来说,我想要了解的是它在哪里被提升。
答案 0 :(得分:1)
在致电console.log(this);
之前添加console.log(this.foo)
,您会看到this
基本上只是window
。这就是您获得全球foo
。
函数中this
的默认值是"全局对象"直接调用时;在浏览器中,全局对象为window
。在这种情况下,您也会看到window
:
function foo() {
console.log(this);
}
foo();
由于您已经定义了一个函数表达式并且已经立即调用它,它实际上是直接调用该函数(类似于直接调用常规函数的方式)。
答案 1 :(得分:1)
Window是一个全局上下文,在其中执行所有操作(通常)。
无论您在函数外部(或在没有var
的函数中)声明什么都被视为全局对象的属性(方法)。
例如,当您致电setTimeout(foo, 1000)
或setInterval(foo, 1000)
时,会相应地将其视为window.setTimeout(foo, 1000)
和window.setInterval(foo, 1000)
。
这部分:
func: function(){
console.log(this.foo); // local
(function(){
console.log(this.foo); // global
})();
当你调用第一个console.log
时,它会在一个函数内部调用,该函数是对象的方法。下一个console.log
在另一个函数内部调用,该函数与func
不在“同一级别”,因此默认情况下其调用conext是全局对象。
当然,您可以通过添加以下行来存储对象本身的引用:
var self = this
所以代码如下:
func: function(){
console.log(this.foo); // local
var self = this;
(function(){
console.log(self.foo); // now it's local
})();
2
问题更多的是关于自我调用功能。是在myObject顶部/上方悬挂的自调用函数。
在您的特定情况下否
吊装是关于函数内部的变量声明。
对象声明不是一回事。 func
只是对象的属性。可以在函数定义中满足提升:
foo = "global";
var test = function(){
var foo;
// Declared but not defined
console.log(foo);
foo = 'local';
// Now it's defined. Thanking to functional scope, the function "sees" local variable
console.log(foo);
}
甚至更好:
foo = 'global';
var test = function(){
console.log(foo); // undefined, but declared
var foo;
foo = 'local';
console.log(foo);
}