JavaScript初阶----------This指向问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript初阶----------This指向问题相关的知识,希望对你有一定的参考价值。

模仿jQuery实现链式调用模式

   有时候我们需要像jQuery一样连续调用方法,这时候我们就要用到this了。

  

var deng = {
    smoke : function () { 
        console.log("smoke,cool!!");
        return this;
    },
    firehair : function () {
        console.log(‘fire‘);
        return this;
    },
    drink : function () { 
        console.log("drink");
        return this;
    }
}
deng.smoke().firehair().drink();

 

   以上代码就是实现了链式调用,当函数一调用执行就会返回自己。

 


 

 

this指向问题

   1.函数预编译过程,this----->window

  2.全局作用域      this -----> window

  3.call / apply,改变this指向,指向第一个参数

  4.object.function() { }     this ------> object

 

  例如:

var obj = {
	age : 20,
	smoke : function () {
		console.log(this);
	}
}
var smoke1 = obj.smoke;
smoke1();

  

  在这个例子当中,把函数体给smoke1,这时候smoke1执行的时候,就相当于自己执行,没有人调用它,所以这时候,正常走预编译环节,指向的是window。

 

再来个比较复杂的,例如:

              var name = "222";
              var a = {
                  name : "111",
                  say : function () {
                      console.log(this.name);
                  }
              }
              var fun = a.say;
              fun();  //  222
              a.say();  //  111
              var b = {
                  name : "333",
                  say : function (fun) {
                      fun();
                  }
              }
              b.say(a.say); // 222
              b.say = a.say; 
              b.say(); // 333

 

  

 

   先是将对象a的函数体给fun,然后fun执行就相当于执行自己的函数,这是this指向的是window,然后对象a调用自己的say方法,这时this指向a,接下来第三个是将a对象里面的函数体

拿出来自己执行,这时候this指向的是window,最后是将a.say里面的函数体给了b.say的函数体,这时候this指向b,用的对象a里面的方法。

 


 

 

属性的表示方法

  我们一般用obj.prop的方法来引用属性,但是有时候当我们需要通过变量传参的形式调用属性会报错,所以我们采用下面这种形式

console.log(obj["prop"]);//obj["prop"]

  

  通过这种方法调用属性,是系统最后的转换形式,就算我们使用点的形式来进行属性的调用,系统内部最后还是会将它转化为中括号的形式。另外就是,通过中括号的形式调用属

性,还能进行属性的拼接:

           function getProp(num){
                var obj = {
                    friend1 : "a",
                    friend2 : "b",
                    friend3 : "c"
                }
                console.log(obj["friend1"]+num+obj["friend2"]+obj["friend3"]);
            }
            getProp("e");//aebc

 


以上是关于JavaScript初阶----------This指向问题的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript初阶----------This指向问题

JavaScript初阶-------- 继承发展史命名空间

JavaScript初阶--------对象构造函数包装类

JavaScript初阶--------函数闭包立即执行函数

C++初阶:模板初阶函数模板 | 类模板

C++初阶:模板初阶函数模板 | 类模板