2018-07-03---This的六道坎(转载)

1.世界尽头,指向window,备胎

比如:

functionfn(){

  console.log(this);

};

fn();


2.点石成金,就是点 . 前面的对象或者方法

比如:

function fn(){

       console.log(this);

}

var b1={

       name:”yuexiaomei”,

       f:fn

}

b1.f();    //b1


3.指腹为婚

Object.prototype.callObject.prototype.apply,可以通过参数指定this,从而来改变this的指向

比如:

var b={

       name:’yuexiaomei’,

       f1(){

                     console.log(this.name);

}

}

var b1={

       name:’xiao’,

}

b.f1.call(b1);    //xiao


4.海誓山盟

Object.prototype.bind,他不但通过新函数来提供永久的绑定,还会覆盖第三层大佬的命令。

function returnThis () {

  return this

}

var boss1 = { name:

'boss1'}

var boss1returnThis =

returnThis.bind(boss1)

boss1returnThis() //

boss1

var boss2 = { name:

'boss2' }

boss1returnThis.call(boss2)// still boss1


5.内有乾坤

当我们new一个函数时,就会自动把this绑定在新对象上,然后再调用这个函数,会覆盖bind的绑定。

New操作符干了哪些事情

(1)创建了一个新的空对象

(2)将this指向新的对象,并绑定了构造函数的prototype里面的方法

(3)执行构造函数里面的代码(为这个新的对象添加属性)

(4)返回新的对象

call,apply,bind三个的使用区别:

都是用来改变函数的this对象的指向的;

第一个参数都是this要指向的对象;

都可以利用后续参数传参;

bind是返回对应函数,便于稍后调用,apply、call是立即调用; 

function showThis () {

  console.log(this);

}

showThis() // window

new showThis() //showThis     ====相当于创建了一个新的对象也叫showThis,然后调用该函数

var boss1 = {

      name:'boss1';

 }

showThis.call(boss1) //

boss1

new showThis.call(boss1)// TypeError   showThis.call is not aconstructor 

var boss1showThis =showThis.bind(boss1)     

boss1showThis() // boss1

newboss1showThis() // showThis


6.军令如山

箭头函数,箭头函数里的this不在妖艳,被永远封印在当前词法作用域之中,在代码运行前就可以确定了,灭掉其他大佬可以覆盖。所以对于箭头函数,重要看他在哪里创建的就行。

function callback (cb) {

  cb()

}

callback(() => {

console.log(this) }) // window

var boss1 = {

  name:

'boss1',

  callback:

callback,

  callback2 ()

{

    callback(()

=> { console.log(this) })

  }

}

boss1.callback(() => {

console.log(this) }) // still window

boss1.callback2(()=> { console.log(this) }) // boss1     callback2在定义的时候是属于boss1这个词法作用域的

你可能感兴趣的:(2018-07-03---This的六道坎(转载))