首頁 >web前端 >js教程 >js指向問題

js指向問題

小云云
小云云原創
2017-12-08 15:00:491530瀏覽
  1. this的指向:
    json和原型鍊是一樣的。
    看了很多文章都說的比較複雜。
    this指向呼叫物件。
    直接貼程式碼吧。


var x = {
         test:function(){
                          console.log(this);
                        };
              };
x.test()//x{...};
var n = x.test();
n();//Window

第一次是x調用,所以console.log的是x,第二次相當於是window. n(),也就是window調用,所以顯示的是window。
可能我理解得比較淺,我覺得this就是包含‘this’得那個函數的'.'前面的對象。至於apply和call會有些變化,我下面粗略說下來。
apply和call的差別就在於,apply是(對象,[參數集合]),call是(對象,參數,參數,參數,參數,參數...),其他的我暫時還不清楚。先貼個代碼。

    function ed(){
    this.age = ed;
    }; 
    function ing(){
    this.age = 2;
    this.sex = 0;
    this.showAge = function(){
        console.log(this.age);
        console.log(this.sex);
        }
    };
    var edObj = new ed();
    var ingObj = new ing();
    ingObj.showAge.apply(edObj);//2,Undefined

這說穿了,就好比一個程式設計師換了台電腦進行開發,除了處理資料的邏輯在自己的腦子裡,其他的環境變數都得用人家的。 apply前面的方法是這個程式設計師的思維,()裡面的方法就是新電腦。至於後面的參數...就是方法所需要的參數,這個可以自己隨便傳。

2.箭頭函數指向: 箭頭函數名字都沒有一個,根本沒辦法被喊著名字去調用,所以this永久指向Window.

3.變數指向:這個我覺得涉及到內存指標的問題。但很好理解,就是常量佔內存,變數往上湊。好比2+小孩玩遊戲一樣,只要你別換地也別去跟其他人玩,你的就是我的,我的也是你的。這個內存就好比小孩遊戲的場地,小孩擁有的玩具就是他們的屬性(這些小孩都比較大方)。
先舉個三個例子:

var xArr = [];
var xJson = {};
(()=>{
      let yArr = xArr,
         yJson = xJson;
       yArr.push(1);
       yJson.age = 1;
      })();//这里说明即便是块级变量也是可以一起参与玩耍的,屋里玩耍的孩子玩具一样可以被其他小孩在屋外展示。
console.log(xArr);//[1]; 
console.log(xJson);//{age: 1}

因為Y一直沒有去找其他人玩(怎麼找別人玩看例子3),所以y的玩具就是x的玩具。

var x = 0,
    a = 2.
    b = 3,
    y = x;
    console.log(y);//0
    y = a+b;
    console.log(x);//0
    console.log(y);//5

因為Y換了一個地方玩(自己開了一個記憶體去指向),所以x拿不到Y的玩具。

var x = {},
    a = {},
    y = x,
    z = y,
    y = a;
    y.age = 1;
    console.log(x);//{}
    console.log(y);//{age:1}
    console.log(z);//{}
    console.log(a);//{age:1}
    z.age = 2;
    console.log(x);//{age:2}

這或許就是一個從此相逢是路人的故事...


#1.this的指向:
json和原型鍊是一樣的。
看了很多文章都說的比較複雜。
this指向呼叫物件。
直接貼程式碼吧。

var x = {
         test:function(){
                          console.log(this);
                        };
              };
x.test()//x{...};
var n = x.test();
n();//Window

第一次是x調用,所以console.log的是x,第二次相當於是window.n(),也就是window調用,所以顯示的是window。
可能我理解得比較淺,我覺得this就是包含‘this’得那個函數的'.'前面的對象。至於apply和call會有些變化,我下面粗略說下來。
apply和call的差別就在於,apply是(對象,[參數集合]),call是(對象,參數,參數,參數,參數,參數...),其他的我暫時還不清楚。先貼個代碼。

    function ed(){
    this.age = ed;
    }; 
    function ing(){
    this.age = 2;
    this.sex = 0;
    this.showAge = function(){
        console.log(this.age);
        console.log(this.sex);
        }
    };
    var edObj = new ed();
    var ingObj = new ing();
    ingObj.showAge.apply(edObj);//2,Undefined

這說穿了,就好比一個程式設計師換了台電腦進行開發,除了處理資料的邏輯在自己的腦子裡,其他的環境變數都得用人家的。 apply前面的方法是這個程式設計師的思維,()裡面的方法就是新電腦。至於後面的參數...就是方法所需要的參數,這個可以自己隨便傳。

2.箭頭函數指向: 箭頭函數名字都沒有一個,根本沒辦法被喊著名字去調用,所以this永久指向Window.

3.變數指向:這個我覺得涉及到內存指標的問題。但很好理解,就是常量佔內存,變數往上湊。好比2+小孩玩遊戲一樣,只要你別換地也別去跟其他人玩,你的就是我的,我的也是你的。這個內存就好比小孩遊戲的場地,小孩擁有的玩具就是他們的屬性(這些小孩都比較大方)。
先舉個三個例子:

var xArr = [];
var xJson = {};
(()=>{
      let yArr = xArr,
         yJson = xJson;
       yArr.push(1);
       yJson.age = 1;
      })();//这里说明即便是块级变量也是可以一起参与玩耍的,屋里玩耍的孩子玩具一样可以被其他小孩在屋外展示。
console.log(xArr);//[1]; 
console.log(xJson);//{age: 1}

因為Y一直沒有去找其他人玩(怎麼找別人玩看例子3),所以y的玩具就是x的玩具。

var x = 0,
    a = 2.
    b = 3,
    y = x;
    console.log(y);//0
    y = a+b;
    console.log(x);//0
    console.log(y);//5

因為Y換了一個地方玩(自己開了一個記憶體去指向),所以x拿不到Y的玩具。

var x = {},
    a = {},
    y = x,
    z = y,
    y = a;
    y.age = 1;
    console.log(x);//{}
    console.log(y);//{age:1}
    console.log(z);//{}
    console.log(a);//{age:1}
    z.age = 2;
    console.log(x);//{age:2}

相關推薦:

JavaScript 中的 this 全面解析

js中的this如何使用

######################################################################################################################################################################### #####JavaScript中this規則的簡單介紹######

以上是js指向問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn