摘要:可以意為這時又是一門運行時的語言,所以我們來看看在不同的情況下的含義處于被對象調用的方法中處于普通函數中在構造函數中的指向用簡單的話來說就是誰調用,就指向誰先看處于被對象調用的方法中二狗子很明顯,調用者是,按照上面的簡單規則誰調用就指向誰所
this
this可以意為這時,javascript又是一門運行時的語言,所以我們來看看this在不同的情況下的含義
處于被對象調用的方法中
處于普通函數中
在構造函數中
this的指向用簡單的話來說就是
誰調用,就指向誰
先看 處于被對象調用的方法中
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj // 很明顯,調用者是obj,按照上面的簡單規則 “誰調用就指向誰” 所以這里的this == obj console.log("汪汪汪"); } }; obj.bark();
再來 處于普通函數中
var obj = { name: "二狗子", bark: function(){ console.log(this); ===> window // 不要以為bark在obj里面定義的,所以this就是obj,記住javascript是在運行時才能確定的,但是這里等于window,也許會讓人有點意外,但是如果你知道了全局環境下所有的屬性方法都是于window就不會奇怪了,所以這里其實隱藏了一個window,所以其實是window.bark();這樣調用的,在參照 “誰調用就指向誰” 所以這里的this == window console.log("汪汪汪"); } }; // 注意前面沒有加obj bark();
接著 在構造函數中
構造函數其實跟普通函數沒有任何區別,在沒有使用new修飾符的時候,函數就是函數,只有加了new后,函數才是一個構造函數,是new賦予了函數的特殊能力讓其進化成了構造函數
func1和func2都是普普通通的函數 function func1(){} function func2(){} new func1(); // 嘭,一瞬間,func1有了新的使命,他成了一個構造函數
那么構造函數有什么用呢? 用處就是,他會返回一個對象
function func1(){ this.name = "一號狗子"; } function func2(){ this.name = "二號狗子"; } var dog = new func1(); // dog1獲得了一個對象 var dog = func2(); // dog2什么都沒有,因為函數沒有返回任何東西 當對函數使用new修飾符時,函數的內部的this的指向則是返回的那個對象,這是js引擎的背后的行為
call apply
call和apply說白了就是改變this指向的兩個方法,這兩個方法屬于function類型,所以只要一個變量的原型鏈上有function,那么它就有call和apply方法
既然說道改變this指向,怎么改變呢?
我們回到第一個例子,這里的this我們已經知道了是指向obj,能改變嗎?能,試試apply
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj console.log("汪汪汪"); } }; obj.bark(); // 第一個參數是你需要將this改指 的變量,后面則是需要傳給func的參數,這里我們沒有給bark傳,所以沒寫 // func.apply(context, arg...) obj.bark.apply(window);
就這么簡單,call也是一樣的使用方式,只是call和apply處理傳入參數的方式有一小點區別,
就是call()方法接受的是一個參數列表,而apply()方法接受的是一個包含多個參數的數組。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82607.html
摘要:理解文章中已經比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執行時決定的,指向被調用函數的對象。與和直接執行原函數不同的是,返回的是一個新函數。這個新函數包裹了原函數,并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執行時決定的,...
摘要:也就是說,區別就是,當你希望改變上下文環境之后并非立即執行,而是回調執行的時候,使用方法而則會立即執行函數。 - call、apply:在 javascript 中,call 和 apply 都是為了改變某個函數運行時的上下文(context)而存在的,換句話說,就是為了改變函數體內部 this 的指向。 JavaScript 的一大特點是,函數存在「定義時上下文」和「運行時上下文」以...
摘要:不能應用下的等方法。首先我們可以通過給目標函數指定作用域來簡單實現方法保存,即調用方法的目標函數考慮到函數柯里化的情況,我們可以構建一個更加健壯的這次的方法可以綁定對象,也支持在綁定的時候傳參。原因是,在中,多次是無效的。 bind 是返回對應函數,便于稍后調用;apply 、call 則是立即調用 。 apply、call 在 javascript 中,call 和 apply 都是...
摘要:可能上面的例子不是很常見,但是我們經常見到這樣的代碼你好美女你好美女方法是數組特有的方法,它是定義在構造函數的原型中的方法,所以我們實例化的數組就都繼承了這個方法,但是字符串是沒有方法,但此處我們就借用了數組的方法來處理字符串。 ??在學習javascript的時候,對于call()和apply()的用法總是難以理解,相信很多小伙伴和我又一樣的想法。現在和小伙伴們分享一下。 call ...
摘要:具體可參考下面代碼定義到原型鏈上的方法這里沒有繼承父類中的方法張三張三太史公曰總結一下與兄弟倆的任務使用一個指定的值和若干個指定的參數值的前提下調用某個函數或方法。本篇人物小傳自此結束。 在JavaScript中,有這么倆貨,一個叫call,一個叫apply,它們倆工作幾乎一毛一樣,但是也有所區別,曾經對這個知識點非常困惑,看過幾篇博客也沒搞清楚這哥倆到底打算要干個啥,直到某天仔細研究...
閱讀 2041·2023-04-25 15:11
閱讀 3461·2021-09-23 11:57
閱讀 1372·2021-07-26 23:38
閱讀 1319·2019-08-30 15:54
閱讀 635·2019-08-30 15:53
閱讀 3245·2019-08-26 13:36
閱讀 986·2019-08-26 12:01
閱讀 2863·2019-08-23 16:21