[JavaScript基础] this,arguments

2018-12-28  本文已影响0人  Darkdreams

函数预编译过程 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

严格模式下,无法使用。

上一篇下一篇

猜你喜欢

热点阅读