我有以下功能。我正在阅读的javascript教程说它应该输出2,但我在我的文本编辑器(JS Fiddle)中未定义。
可能是什么原因?这与严格模式与非严格模式有关吗?
function foo(){
console.log( this.a );
}
var a = 2;
foo(); //should output "2" but I'm getting undefined. Why?
答案 0 :(得分:3)
那是因为你在JSFiddle创建的函数包装器中运行代码。默认值为onLoad
,它将代码放在一个在load事件上运行的函数中。
这使a
变量成为该函数的局部变量,而不是全局变量。当您尝试使用this.a
访问它时,它会在window.a
中查找变量(因为this
将指向window
对象),但因为变量不是全局的它无法在那里找到。
如果您选择No wrap - in <head>
或No wrap - in <body>
来放置代码,您将获得2
作为输出。
答案 1 :(得分:0)
本教程可能假设此代码将在全局对象的上下文中执行,在这种情况下它确实会打印2.您可以在浏览器控制台中复制/粘贴代码段,您可以自己查看输出为2。
但是,如果将代码放在函数中然后执行该函数,代码将打印undefined
。我不是100%肯定JSFiddle如何工作的优点,但在你的情况下,这就是正在发生的事情:它代表你把代码放在一个函数中。
答案 2 :(得分:-1)
当您致电this.a
时,您正在寻找foo
函数原型中的属性。定义var a = 2
只是创建一个名为a
的新变种。
你想要做的是在foo put this.a = 2
内,然后你的控制台将正确输出。另外,如果要分配函数外部的值
var foo = new foo();
foo.a = 2;
console.log(foo.a);
随时问我问题!