js this指向分析
一、普通函数
1、this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁;
实际上this的最终指向的是那个调用它的对象
1 1) function a() { 2 var name = 'xiaoming' 3 console.log(this) // window 4 console.log(this.name) // undefined 5 } 6 7 window.a() 8 9 2) var b = { 10 name: 'xiaoming', 11 like: function() { 12 console.log(this) // b 13 } 14 } 15 b.like() 16 17 3) var c = { 18 name: 'xiaoming', 19 intro: { 20 like: 'drinking', 21 age: function() { 22 console.log(this) 23 } 24 } 25 } 26 c.intro.age() // intro 27 var d = c.intro.age 28 d() // window ** this的最终指向的是那个调用它的对象 , 此时通过赋值后调用他的是window
二、构造函数
1、new 操作符作用:
new操作符会创建一个对象实例
具体如下:
1)创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2)属性和方法被加入到 this 引用的对象中。
3)新创建的对象由 this 所引用,并且最后隐式的返回 this 。
1 var obj = {}; 2 obj.__proto__ = Base.prototype; 3 Base.call(obj);
2、call 、apply 、bind 用法
这三种方法都是函数实例上的方法,都可以改变this上下文环境
1)call、apply 如果第一个参数传null , 则会将this指向全局环境 ; apply 以数组的形式传递多个参数
2) bind 会创建一个新的函数体,通常用作绑定原来函数的this值
1 // call Function.call(thisObj,arg1,arg2,arg3) 2 // call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 3 4 1) var f = { 5 name: 'xiaoming', 6 intro: { 7 like: 'drinking', 8 age: function() { 9 console.log(this.like) 10 } 11 } 12 } 13 14 var g = f.intro.age 15 f.intro.age() // drinking 16 g() // undefined 17 g.call(intro) // 将this指针指向改为指向intro drinking 18 19 2) // bind 20 var h = { 21 name: 'xiaoming', 22 intro: { 23 like: 'drinking', 24 age: function() { 25 console.log(this.like) 26 } 27 } 28 } 29 var i = f.intro.age 30 var j = i.bind(intro) 31 j() // bind 需要调用才能执行
3)构造函数返回对象
当构造函数内部返回对象时,此时 this 指向返回的那个对象
1 function K() { 2 this.name = 'xiaoming' 3 return {} 4 }
var l = new K()
console.log(l.name) // undefine
三、箭头函数
1) “箭头函数” 没有自己的this,其派生的this遵循词法作用域规则,因此this解析时总是指向其外层作用域的this
2) “箭头函数”的this,总是指向定义时所在的对象,而不是运行时所在的对象
1 var o = { 2 a: 12, 3 b: { 4 a: 11, 5 fn: () => { 6 console.log(this.a) // this 指向外层的window 7 } 8 } 9 } 10 o.b.fn()
1 function P(){ 2 this.index = 1; 3 setInterval(() => console.log(this.index++) , 100) // ---> this 指向 P 4 } 5 var exp1 = new P() 6 console.log(exp1()) 7 8 function Q(){ 9 this.index = 1; 10 setInterval( 11 function(){ 12 console.log(this.index++) // ---> this 指向 window 13 }, 14 100 15 ) 16 } 17 var exp2 = new Q() 18 console.log(exp2())
参考:
对内贵有志气,对外贵得人心