函数预编译过程 this
指向 window
全局作用域 this
指向 window
function test() {
console.log(this) //指向window
}
test()
call
/ apply
可以改变函数运行时 this
指向
obj.func()
func()
里面的this
指向obj
var name = "JIM"
var obj = {
func : function() {
console.log(this.name)
},
name : "Tom"
}
obj.func() // Tom
面试题
var name = "222";
var a = {
name : '111',
say : function() {
console.log(this.name)
}
}
var fun = a.say;
fun(); //222
// 执行fun方法是在全局,所以this指向全局,name是222
a.say(); // 111
// 执行say()方法是在a对象的作用域下,this指向a对象,name是111
var b = {
name : "333",
say: function(fun) {
fun(); //a.say
}
}
b.say(a.say); //222
b.say = a.say;
// 相当于
//var b = {
// name : "333",
// say: function(fun) {
// console.log(this.name)
// }
//}
b.say(); //333
// 相当于上面的注释,b对象的say()方法与a对象的say()相同。执行时在b对象中,this指向b对象。
arguments
arguments callee
指向函数自身引用
function test() {
console.log(arguments.callee)
}
test(); //fn test
//计算阶乘,用递归自己调用自己
//但立即执行函数没有方法名,使用arguments.callee获取自身。
var num = (function(n) {
if (n == 1) {
return 1;
}
return n * arguments.callee(n - 1)
}(20)) // 2432902008176640000
func.caller
严格模式下,无法使用。
网友评论