了解这些之前,首先得了解this
在函数调用中 this的指向问题 function wq() { console.log(this) } wq() // 这里指向window 因为这时是在全局作用域下调用的 所以this会绑定到全局对象window
var aaa = '我是aaa' function wq() { var aaa = '我是wq里的aaa' function wq1() { console.log(this.aaa) } return wq1 } wq()() // 打印 我是aaa 当函数套函数时 内部函数指向的也是window 所以打印的是全局下的aaa
// 在构造函数中,this会指向使用构造函数生成的对象中 // 构造函数 function Fn(name) { this.name = name Fn.prototype.getName = function() { console.log(this.name) } }
var a = new Fn('我是a') var b = new Fn('我是b') var c = new Fn('我是c')
a.getName() // 打印我是a b.getName() // 打印我是b c.getName() // 打印我是c
在对象中调用时 var name = '我是aaa'
var obj = { objName: this.name, age: 24, getObj: function() { console.log('我的name是' + this.name + '我的age是' + this.age) } }
obj.objName // 打印 我是aaa 因为这里指向的是全局对象window 为什么会指向window呢 在声明时对象还没有建立 自然就没有this 还有判断this指向时是看 是谁的调用 而不是定义
obj.getObj() // 这里 this.name 打印 undefined this.age 打印 24 因为这里的this.name指向obj 但是obj中并没有name
接下来bind
var name = '我是aaa' var obj = { name: '我是obj里的aaa', getName: function() { console.log(this.name) } }
var lzw = { name: '我是lzw' }
obj.getName // 我是obj里的aaa 这个就不多BB了
obj.getName.bind(lzw)() // 打印 我是lzw 这里为什么需要加一个()呢 是因为bind返回的是一个新函数 一定要记住 返回的是一个函数(对我自己说的)
bind能干啥用,使用场景,(我自己用的也很少,希望有大佬能指点一下),只知道有一个创建函数,让这个函数this指向不会改变
var name = '我是aaa' var obj = { name: '我是obj里的aaa', getName: function() { console.log(this.name) } }
var wq = obj.getName; wq() // 打印 我是aaa 因为这里调用wq时 是在全局作用域下调用的 所以这里的this.name是 我是aaa
var wq1 = obj.getName.bind(obj) wq1() // 这里就会打印 我是obj里的aaa了
call方法
function wq() { console.log(this) }
var obj = {name: '我是obj'}
wq.call() // 打印 window wq.call(null) // 打印 window wq.call(undefined) // 打印 window wq.call(1) // 打印 Number wq.call(' ') // 打印 String wq.call(true) // 打印 Boolean wq.call(function(){}) // 打印 function(){}