摘要:可以改變函數的指向。除了傳遞參數時有所差別,和作用完全一樣。因此最終的返回結果會是。其中傳遞的參數為數組形式傳遞的參數為按順序依次排列。一個簡單的實例說明。
call/apply 可以改變函數的this指向。 除了傳遞參數時有所差別,call和apply作用完全一樣。
var tim = { name: "tim", age: 20, getName: function() { console.log(this.name); return this.name; } } var jake = { name: "jake", age: 20 } tim.getName(); // tim // jake對象沒有getName方法,但是可以通過call/apply去使用tim對象的getName方法 tim.getName.call(jake); // jake tim.getName.apply(jake); // jake
tim.getName.call(jake)的意思是執行getName方法,但是通過call/apply將getName方法中的this指向強行設置為jake對象。因此最終的返回結果會是jake。
call apply的不同之處在于傳遞參數的形式。其中apply傳遞的參數為數組形式, call傳遞的參數為按順序依次排列。一個簡單的實例說明。
// 當參數個數不確定或者你覺得用apply比較爽時, 就直接使用apply // 字面解釋就是obj奪舍fn,obj擁有了執行fn函數的能力,并且this指向obj. var arguments = { 0:"name", 1:"age", 2:"gender" }; fn.apply(obj, arguments); fn.call(obj, name, age, gender);
下面我收集了幾個我遇到過的實際例子
將類數組形式轉換為數組
// arguments // 返回值為數組,arguments保持不變 var arg = [].slice.call(arguments); // nodeList var nList = [].slice.call(document.getElementsByTagName("li"));
方法借用
var foo = { name: "joker", showName: function() { console.log(this.name); } }; var bar = { name: "rose" }; foo.showName.call(bar); // rose
在繼承中的應用
// parent var Person = function(name) { this.name = name; this.gender = ["man", "woman"]; } // child var Student = function(name, age) { // inherit Person.call(this); } Student.prototype.message = function() { console.log("name:"+this.name+", age:"+this.age+", gender:."+this.gender[0]); } var xm = new Student("xiaom", 12); xm.message(); //name:undefined, age:undefined, gender:.man
封裝對象時保證this指向
var Nicco = function(name) { this.name = name; } Nicco.prototype = function() { constructor: Nicco, message: function() { var _this = this; addEventListener( "mousedown", function() { // stay this return _this.fndown.call(_this); }, false ); }, fndown: function() { var _this = this, str = this.name + ", i miss you."; addEventListener( "mouseup", function() { return _this.fnup.call(_this, str); }, false ); }, fnup: function(str) { console.log(str); } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/86168.html
在上一篇文章(《javascript高級程序設計》筆記:Function類型)中稍微提及了一下函數對象的屬性—this,在這篇文章中有深入的說明: 函數的三種簡單調用模式 1 函數模式 定義的函數,如果單獨調用,不將其與任何對象關聯,那么就是函數調用模式 function fn(num1, num2) { console.log(this); } // 直接在全局調用 fn();// w...
總結call,apply,bind方法的理解使用和區別。 call,apply,bind這三個方法在JavaScript中是用來改變函數調用的this指向。那么改變函數this指向有什么用呢?我們先來看一段代碼 var a= { name:harden, fn:function () { console.log(this.name); } } var b =...
摘要:理解文章中已經比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執行時決定的,指向被調用函數的對象。與和直接執行原函數不同的是,返回的是一個新函數。這個新函數包裹了原函數,并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執行時決定的,...
摘要:返回值這段在下方應用中有詳細的示例解析。回調函數丟失的解決方案綁定回調函數的指向這是典型的應用場景綁定指向,用做回調函數。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當重要的概念,與 this...
摘要:回調函數在回調函數中的指向也會發生變化。在閉包回調函數賦值等場景下我們都可以利用來改變的指向,以達到我們的預期。文章參考系列文章理解閉包理解執行棧理解作用域理解數據類型與變量原文發布在我的公眾號,點擊查看。 這是本系列的第 5 篇文章。 還記得上一篇文章中的閉包嗎?點擊查看文章 理解 JavaScript 閉包 。 在聊 this 之前,先來復習一下閉包: var name = Nei...
閱讀 3878·2021-09-27 13:36
閱讀 4554·2021-09-22 15:12
閱讀 3063·2021-09-13 10:29
閱讀 1826·2021-09-10 10:50
閱讀 2360·2021-09-03 10:43
閱讀 518·2019-08-29 17:10
閱讀 442·2019-08-26 13:52
閱讀 3249·2019-08-23 14:37