前往小程序,Get更优阅读体验!
立即前往
发布

this

作者头像
菜的黑人牙膏
发布2019-01-15 11:20:28
发布2019-01-15 11:20:28
25400
代码可运行
举报
运行总次数:0
代码可运行

调用位置:函数在代码中调用的位置,而不是声明的位置。

调用栈:为了到达当前执行位置的所有调用的函数。

例子:

代码语言:javascript
代码运行次数:0
复制
function baz(){

     //当前调用栈为baz

    //调用位置是全局作用域

    console.log("baz");

    bar(); //bar的调用位置

}

   function bar(){

    //当前调用栈为bar->baz

    //调用位置是baz

    console.log("bar");

    foo(); //foo调用位置

}

   function foo(){

   //当前调用栈为foo->bar->baz

  //调用位置是bar

   console.log("foo");

}

调用位置则是调用栈的第二个元素,可以使用调试器找出调用栈。

函数执行过程中如何使用调用位置决定this的绑定对象。

this绑定有四种规则:

1.默认绑定:this指向全局对象,可以看做无法应用其他规则时的默认规则。

代码语言:javascript
代码运行次数:0
复制
function foo(){

    console.log(this.a);

}

  var a = 2;

  foo() // 2

通过分析调用位置,发现foo()是直接使用不带任何修饰的函数进行调用的。

2.隐式绑定:调用位置是否有上下文。

代码语言:javascript
代码运行次数:0
复制
function foo(){

   console.log(this.a);

}

  var obj = {

     a:2,

     foo:foo

};

  obj.foo() //2

调用位置会使用obj上下文来引用函数。注意,当使用回调函数时,因为函数作为参数传入时,实际上是一个隐式赋值操作,如下:

代码语言:javascript
代码运行次数:0
复制
 function foo(){

   console.log(this.a)

}

 function doFoo(fn){

   //fn其实引用的是foo

   fn(); //调用位置

}

 var obj ={

   a:2,

   foo:foo

}

var a = "global";

 doFoo(obj.foo); //"global"

3.显式绑定:即使用call,apply,bind等内置函数修改this的值。

代码语言:javascript
代码运行次数:0
复制
var obj ={
  a:2
}
function d (){
   console.log(this.a)
}
d.call(obj); //2

显式绑定中有一种硬绑定:用于为了保证this不缺失,如下:

代码语言:javascript
代码运行次数:0
复制
var obj ={
  a:2
}
var abc = function(){
  d.call(obj);  

//d函数的this一直指向了obj

}
function d (){
   console.log(this.a)
}
abc(); //2  

4:new绑定。(Js中的new与其他语言完全不同)

  new操作有以下四个步骤:

  1.创建一个全新的对象。

  2.这个对象会被执行原型链接。

  3.这个对象会绑定到函数调用的this.

  4.如果函数没有返回其他对象,则new表达式中的函数调用自动返回这个对象。

代码语言:javascript
代码运行次数:0
复制
 function foo(){

    this.a =2;

}

  var baz = new foo();

  console.log(baz.a);  //2

最后是优先级:

   new>显示>隐式>默认。

   具体例子可参考书P91~P。。。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-02-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档