2016-01-25 175 views
-1

你能向我解释为什么这段代码显示错误,并且不打印任何东西吗?此代码不打印任何内容

var myObject = { 
    test: "bar", 
    myfunc: function() { 
    var self = this; 
    console.log("outer myfunc: this.test = " + this.test); 
    console.log("outer myfunc: self.test = " + self.test); 
    (function() { 
     console.log("inner myfunc: this.test = " + this.test); 
     console.log("outer myfunc: self.test = " + self.test); 
    }()); 
    } 
}; 

它没有错误编译成功,但运行后,仅打印未定义的字符串

+1

你能显示你的函数调用代码吗? –

+1

你是什么意思编译? JS解释! –

+2

你在哪里/如何调用你的函数?这个代码本身并没有做任何事情。 –

回答

0

您正在创建可以在未来调用的函数。但是你并没有真的叫它。你需要调用它。

//Here's where you create your function 
var myObject = { 
    test: "bar", 
    myfunc: function() { 
    var self = this; 
    console.log("outer myfunc: this.test = " + this.test); 
    console.log("outer myfunc: self.test = " + self.test); 
    (function() { 
     console.log("inner myfunc: this.test = " + this.test); 
     console.log("outer myfunc: self.test = " + self.test); 
    }()); 
    } 
}; 

//Now that you've created your function, you can use it. 
myObject.myFunc(); 

tutorial中的“调用JavaScript函数”部分可能会有帮助。

-1

除非你使用myfunc,这可以通过从myObject访问myFunc,就像访问来完成您的代码将不再打印一个对象属性。因此,随着您现有的代码,写入以下任何地方:

myObject.myfunc(); 

哪应该显示您所期望的控制台输出。如果您发现超出此范围的任何错误,请通过添加下面的评论让我知道。

+0

谢谢,输出为myfunc:this.test = bar outer myfunc:self.test = bar inner myfunc:this.test = undefined outer myfunc:self.test = bar –

0

在第3行上,您已在对象myObject上定义了一个方法myFunc。这将只有console.log当您调用myObject.myfunc();

在第7行,你创建一个IIFE。这定义了一个函数并立即调用它。当您调用myObject.myfunc();

myFunc在全局范围内不存在时,这也将只有console.log。它是一个连接到myObject的方法。

console.log("outer myfunc: this.test = " + this.test);

console.log("outer myfunc: self.test = " + self.test);

这里在线路5和6 selfthis将始终指代相同的对象。如果您调用函数myObject.myfunc();,那么this.testself.test都将计算为"bar"。现在

,如果你做setTimeout(myObject.myfunc, 0);那么这两个selfthis将参考这样test将不确定的window对象(window.test当前未定义)。这是因为this对象是在Javascript中的运行时动态确定的。将myObject.myfunc注册为回调将评估为指向所定义函数的指针。在这种情况下调用你的myfunc将是一个免费函数调用 - 没有myObject作为this上下文它将默认为window对象。

console.log("inner myfunc: this.test = " + this.test);

console.log("outer myfunc: self.test = " + self.test);

在8号线和9 this总是指window对象和打印undefined,除非你指定test到窗口。 Self将遵循上面解释的模式。