js中this指向問題

js中this指向問題老生常談的問題了,在這裏說一下我所理解的層面的this。數組

this 指的是當前對象,若是在全局範圍內使用this,則指代當前頁面window;若是在函數中使用this,則this指代什麼是根據當前函數是在什麼對象上調用。咱們能夠使用call和apply改變函數中this的具體指向。app

console.log(this === window)  // true
console.log(window.alert === this.alert)  // true
console.log(this.parseInt("021",10))  // 21
parseInt(string,radix); 
// 當只使用一個參數時,咱們都知道是將其轉爲整數;
// radix 取值爲 2~36,表示當前數是幾進制,並將這個數轉成十進制,當不在這個範圍時,會輸出NaN;                   

函數中的this是在運行時候決定的,而不是函數定義時。函數

    function foo(){
            console.log(this.fruit);
    }
    // 定義一個全局變量,等同於window.fruit = "banana";
    var fruit = "banana";
    // 此時函數中的this指向window;
    foo();  //   "banana"
    
    var  o = {
          fruit : "apple",
          foo : foo    
    };
    // 此時函數中的this指向o
    o.foo();  // "apple"

全局函數apply和call能夠用來改變this的指向,以下:ui

    function foo(){
            console.log(this.fruit);
    }
    // 定義一個全局變量,等同於window.fruit = "banana";
    var fruit = "banana";

    var  o = {
          fruit : "apple"
    };
    
    foo.apply(window);  // "banana";
    foo.call(o);  // "apple";

apply和call的惟一區別,就是在傳參的時候,apply的參數須要放在一個數組裏面,而call不須要;this

由於在JavaScript中,函數也是對象,咱們看下面這個例子:spa

 1     function foo(){
 2          if(this === window){
 3              console.log("this is window");
 4         }   
 5     };
 6     // 函數foo也是對象,能夠爲對象定義屬性,而後屬性爲函數
 7     foo.boo = function(){
 8         if(this === foo){
 9              console.log("this is foo");       
10         }else if(this === window){
11                 console.log("this is window");
12             }
13     };
14     
15     // 等價於 window.foo();
16     foo();  // "this is window";
17     // 能夠看到函數中this的指向調用函數的對象
18     foo.boo();  // "this is foo";
19     // 能夠使用call改變函數中this指向
20     foo.boo.call(window); // "this is window";

對象中的嵌套函數的this指向不是當前對象,而是window,看以下例子:code

    var name = "window.name";
      var obj = {
          name : "obj.name",
          getName:function(){
              console.log(this.name);
              return function(){
                  console.log(this.name);
              } 
          }
      }
      obj.getName()();  // "obj.name"  "window.name"

一樣是obj調用的getName和getName裏面的方法,結果倒是不一樣的值,這就說明嵌套函數中的this已經不指向當前對象了,而指向window。對象

那麼,咱們要怎樣解決上述問題呢?主要有三種解決辦法,以下:blog

1.使用函數的bind方法,綁定當前this;ip

 1     var name = "window.name";
 2       var obj = {
 3           name : "obj.name",
 4           getName:function(){
 5               console.log(this.name);
 6               return function(){
 7                   console.log(this.name);
 8               }.bind(this);
 9           }
10       };
11       obj.getName()();  //  "obj.name"  "obj.name"

2.使用變量將上面的this接收一下,而後下面不使用this,使用那個變量;

 1       var name = "window.name";
 2       var that = null;
 3       var obj = {
 4           name : "obj.name",
 5           getName:function(){
 6               that = this;
 7               console.log(this.name);
 8               return function(){
 9                   console.log(that.name);
10               }
11           }
12       }
13       obj.getName()();  //  "obj.name"    "obj.name"

3.使用ES6的箭頭函數,能夠完美避免此問題;

 1       var name = "window.name";
 2       var obj = {
 3           name : "obj.name",
 4           getName:function(){
 5               console.log(this.name);
 6               return () => {
 7                   console.log(this.name);
 8               }
 9           }
10       }
11       obj.getName()();    //  "obj.name"    "obj.name"

 

好了,關於js中this的指向問題就介紹到這裏啦。若是你學到了記得點贊喲!

相關文章
相關標籤/搜索