JavaScript中的自调用函数
我知道提升的一般规则,变量和函数在编译阶段被提升 因此,任何东西都写如下JavaScript中的自调用函数,javascript,Javascript,我知道提升的一般规则,变量和函数在编译阶段被提升 因此,任何东西都写如下 var foo = 'global'; 将汇编为: var foo; // Undefined foo = 'global'; // Declared 但这是我无法理解的 为什么myObject中的自调用函数打印全局foo/获取窗口上下文 一般来说,我试图理解的是它被吊到了哪里。添加console.log(这个)
var foo = 'global';
将汇编为:
var foo; // Undefined
foo = 'global'; // Declared
但这是我无法理解的
为什么
myObject
中的自调用函数打印全局foo/获取窗口上下文
一般来说,我试图理解的是它被吊到了哪里。添加console.log(这个)在调用console.log(this.foo)
之前,您将看到this
实际上只是窗口。这就是您获得全局foo
的原因
直接调用函数时,此
的默认值为“全局对象”;在浏览器中,全局对象是窗口
。在这种情况下,您还将看到窗口
:
function foo() {
console.log(this);
}
foo();
因为您已经定义了一个函数表达式并立即调用了它,所以它本质上是直接调用函数(类似于您直接调用常规函数的方式)。Addconsole.log(this)在调用console.log(this.foo)
之前,您将看到this
实际上只是窗口。这就是您获得全局foo
的原因
直接调用函数时,此
的默认值为“全局对象”;在浏览器中,全局对象是窗口
。在这种情况下,您还将看到窗口
:
function foo() {
console.log(this);
}
foo();
因为您已经定义了一个函数表达式并立即调用了它,所以它本质上是直接调用函数(类似于您直接调用常规函数的方式)。窗口是一个全局上下文,在其中执行所有操作(通常)
在函数外部(或在没有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
不在“同一级别”,因此默认情况下其调用上下文是全局对象
当然,您可以通过放置以下行来存储对对象本身的引用:
var self = this
因此,代码如下所示:
func: function(){
console.log(this.foo); // local
var self = this;
(function(){
console.log(self.foo); // now it's local
})();
二,
问题更多的是关于自调用函数。是否将自调用功能提升到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);
}
窗口是一个全局上下文,在其中执行所有操作(通常)
在函数外部(或在没有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
不在“同一级别”,因此默认情况下其调用上下文是全局对象
当然,您可以通过放置以下行来存储对对象本身的引用:
var self = this
因此,代码如下所示:
func: function(){
console.log(this.foo); // local
var self = this;
(function(){
console.log(self.foo); // now it's local
})();
二,
问题更多的是关于自调用函数。是否将自调用功能提升到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);
}
因为这个
在IIFE中是窗口
。调用它的执行上下文是全局上下文。这是因为未在对象(如obj.func()
上调用函数,因此此
默认指的是window
。是否仅当声明obj.func()时才执行自调用函数。@patz它与提升无关。您对上下文的理解不适合js…因为IIFE中的这个是窗口
。调用它的执行上下文是全局上下文。这是因为未在对象(如obj.func()
上调用函数,因此此
默认指的是window
。是否仅当声明obj.func()时才执行自调用函数。@patz它与提升无关。你对上下文的理解不适合js…但也许可以解释为什么它是window
。@AndrewLi刚刚添加了一行解释为什么。问题更多的是关于自调用函数。自调用函数是否被提升到myObject的外部/上方。@patz IILife涉及一个函数表达式,因此它没有被提升。但也许可以解释为什么它是窗口
。。@AndrewLi刚刚添加了一行解释原因。问题更多地是关于自调用函数。自调用函数是否被提升到myObject的外部/上方。@patz IIFE涉及函数expr