Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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中的作用域和自调用_Javascript_Closures_Self Invoking Function - Fatal编程技术网

混淆JavaScript中的作用域和自调用

混淆JavaScript中的作用域和自调用,javascript,closures,self-invoking-function,Javascript,Closures,Self Invoking Function,让我们看看这个例子: var x = 3; var obj = { x:2, test: function(){ var x = 1; console.log(this.x); } }; 然后我们有不同的方法来调用这个函数: obj.test(); // line 1 obj.test.call(null); // line 2 (obj.test)(); // line 3 (obj.test = obj.test)(); // line 4 (obj

让我们看看这个例子:

var x = 3;

var obj = {
  x:2,
  test: function(){
    var x = 1;
    console.log(this.x);
  } 
};
然后我们有不同的方法来调用这个函数:

obj.test(); // line 1

obj.test.call(null); // line 2

(obj.test)(); // line 3

(obj.test = obj.test)(); // line 4

(obj.test || obj.test)(); // line 5

(obj.test && obj.test)(); // line 6

(obj.test, obj.test)(); // line 7

我理解前3行,但有人能进一步解释一下(第4行到第7行)是怎么回事吗。这令人困惑

从4到7在每种情况下,它只返回函数,不返回上下文。因此,当您从对象抓取函数时,它会丢失其上下文。然后它尝试调用函数,其中的
this
指的是全局对象,它是窗口,
x
在窗口中是3。因此,在
使用严格的
模式下,它将为空,在其他模式下,它将是窗口

4)将右侧值指定给左侧值并返回

(obj.test = obj.test)()
5)如果第一个操作数为真,则返回它,否则返回第二个操作数

obj.test || obj.test
6)如果第一个和第二个操作数为真,则返回第一个操作数,否则返回第二个操作数

obj.test && obj.test
7)在这种情况下,它只返回第二个对象<代码>,
逗号仅将对象彼此分开

(obj.test, obj.test)()

这有一个sens,但我不明白为什么这个4行函数失去了它的上下文。换句话说,为什么第4行与第4行不同3@Przemek第3行没有返回任何内容,但是
=
操作符就是这样工作的。JS就是这样工作的。如果您从对象分配函数,它将获得函数,而不是上下文。我的意思是结果是控制台。第3行为2,但第4行控制台日志为3。当我这样做时(obj.test=obj.test),然后obj.test()console.log仍然是2
obj.test=obj.test
将赋值并返回值。因此它返回的函数的上下文丢失。(obj.test)()返回的不是函数而是
obj.test
,因为在
()
中没有运算符in short,因此“this”不绑定到(对象obj的)文本范围,而是动态设置的。因此,.call(context,parameters)或.apply(context,parameters)可用于控制上下文和函数的“this”。在您的示例中使用“this”的方式不是首选的,也不是含糊不清的。尝试显式引用对象。