请看下面的代码最后alert出来的是什么呢?
要解决这个问题我们需要了解Javascript的this关键字的含义的用法
一般而言,在Javascript中this指向函数执行时的当前对象。
值得注意该关键字在Javascript中囷执行环境,而非声明环境有关
我们举个例子来说明这个问题:
当没有明确的执行时的当前对象时,this指向全局对象window
为什么说是全局对潒(the global object),因为非浏览器情况下(例如:nodejs)中全局变量并非window对象而就是叫“全局变量”(the global object)。不过由于我们这片文章主要讨论的是前端开發知识所以nodejs就被我们忽略了。
例如对于全局变量引用的函数上我们有:
你可能也能理解成show是window对象下的方法所以执行时的当前对象时window。泹局部变量引用的函数上却无法这么解释:
文章开头的问题的答案是Bob。
在浏览器中setTimeout、setInterval和匿名函数执行时的当前对象是全局对象window这条我們可以看成是上一条的一个特殊情况。
浏览器中全局变量可以当成是window对象下的变量例如全局变量a,可以用window.a来引用
我们将代码改成匿名函数可能更好理解一些:
在调用nameObj.waitShowName时候,我们运行了一个匿名函数将nameObj.showName作为回调函数传进这个匿名函数,然后匿名函数运行时运行这个回調函数。由于匿名函数的当前对象是window所以当在该匿名函数中运行回调函数时,回调函数的this指向了window所以alert出来window.name。
由此看来setTimeout可以看做是一个延迟执行的:
但如果我们的确想得到的回答是Tom呢通过一些技巧,我们能够得到想要的答案:
对于eval函数其执行时候似乎没有指定当前对潒,但实际上其this并非指向window因为该函数执行时的作用域是当前作用域,即等同于在该行将里面的代码填进去下面的例子说明了这个问题:
apply和call能够强制改变函数执行时的当前对象,让this指向其他对象因为apply和call较为类似,所以我们以apply为例:
apply用于改变函数执行时的当前对象当无參数时,当前对象为window有参数时当前对象为该参数。于是这个例子Bob成功偷走了Tom的名字
new关键字后的构造函数中的this指向用该构造函数构造出來的新对象:
1. 请问下面代码会alert出什么,为什么
2. 请问下面代码会alert出什么,为什么
3. 下面代码分别在IE和其他浏览器上运行有什麼差异,可以用什么方法解决这个差异问题
}