摘要:根據各自執行時機的不同來選擇采用哪種方案。不可以當作構造函數,也就是說,不可以使用命令,否則會拋出一個錯誤。不可以使用對象,該對象在函數體內不存在。不能使用箭頭函數可以讓里面的,綁定定義時所在的作用域,而不是指向運行時所在的作用域。
this是什么
this就是函數內部的關鍵字看下面例子理解js中的this
// 例子1 function fnOne () { console.log(this) } "use strict" function fnOne () { console.log(this) } // 例子2 let a = { txt: "hello world", fn: function() { console.log(this.txt) } } a.fn() window.a.fn() // 例子3 let b = { txt: "hello", obj: { txt: "world", fn: function(){ console.log(this.txt) console.log(this) } } } let c = { txt: "hello", obj: { // txt: "world", fn: function(){ console.log(this.txt) } } } b.obj.fn() c.obj.fn() let d = b.obj.fn d()
// 例子4 function Fn () { this.txt = "hello world" } let e = new Fn() e.txt // 例子5 function Fn () { this.txt = "hello world" return {txt:"hello"} } function Fn () { this.txt = "hello world" return [1] } function Fn () { this.txt = "hello world" return 1 } function Fn () { this.txt = "hello world" return null } function Fn () { this.txt = "hello world" return undefined } let e = new Fn() e.txt // 帶有{}或者[]返回值的方法實例化時this指向被改變
// 例子6 // 箭頭函數與包裹它的代碼共享相同的this對象 // 如果箭頭函數在其他函數的內部 // 它也將共享該函數的arguments變量 let bob = { _name: "Bob", _friends: [], printFriends: () => { console.log(this._name) console.log(this) } } let bob = { _name: "Bob", _friends: [], printFriends() { console.log(this._name) console.log(this) } } let bob = { _name: "Bob", _friends: [1], printFriends() { this._friends.forEach((item) => { console.log(this._name) }) } } // arguments 對象 function square() { let example = () => { let numbers = []; for (let number of arguments) { numbers.push(number * number); } return numbers; }; return example(); } square(2, 4, 7.5, 8, 11.5, 21); // returns: [4, 16, 56.25, 64, 132.25, 441]this的指向
this永遠指向的是最后調用它的對象(箭頭函數除外)this的應用 如何改變函數的this指向 apply call bind
三者的區別apply和call改變函數this而且是立即執行。bind(es5新加方法注意兼容性)是復制函數,不會立即執行。根據各自執行時機的不同來選擇采用哪種方案。
function Product(name, price) { this.name = name this.price = price } function Food(name, price) { Product.call(this, name, price) // Product.apply(this, arguments) this.category = "food" } console.log(new Food("cheese", 5).name)
bind用法和可以解決的問題
// 解決,從對象中拿出方法定義給新變量,但是希望方法的this值保持不變這時可以用bind來綁定this this.x = 9; var module = { x: 81, getX: function() { return this.x; } }; module.getX(); // 返回 81 var retrieveX = module.getX; retrieveX(); // 返回 9, 在這種情況下,"this"指向全局作用域 // 創建一個新函數,將"this"綁定到module對象 // 新手可能會被全局的x變量和module里的屬性x所迷惑 var boundGetX = retrieveX.bind(module); boundGetX(); // 返回 81 // bind配合setTimeout() function LateBloomer() { this.petalCount = Math.ceil(Math.random() * 12) + 1; } LateBloomer.prototype.bloom = function() { window.setTimeout(this.declare.bind(this), 1000); } LateBloomer.prototype.declare = function() { console.log("I am a beautiful flower with " + this.petalCount + " petals!"); } var flower = new LateBloomer(); flower.bloom(); // 一秒鐘后, 調用"declare"方法箭頭函數的this使用注意事項
1、函數體內的this對象,就是定義時所在的對象,而不是使用時所在的對象。
2、不可以當作構造函數,也就是說,不可以使用new命令,否則會拋出一個錯誤。
3、不可以使用arguments對象,該對象在函數體內不存在。如果要用,可以用 rest 參數代替。
4、不可以使用yield命令,因此箭頭函數不能用作 Generator 函數。
5、不能使用apply/call/bind
// 箭頭函數可以讓setTimeout里面的this,綁定定義時所在的作用域,而不是指向運行時所在的作用域。下面是另一個例子。 function Timer() { this.s1 = 0; this.s2 = 0; // 箭頭函數 setInterval(() => this.s1++, 1000); // 普通函數 setInterval(function () { this.s2++; }, 1000); } var timer = new Timer(); setTimeout(() => console.log("s1: ", timer.s1), 3100); setTimeout(() => console.log("s2: ", timer.s2), 3100); // s1: 3 // s2: 0
// 箭頭函數可以讓this指向固定化,這種特性很有利于封裝回調函數。下面是一個例子,DOM 事件的回調函數封裝在一個對象里面。 var handler = { id: "123456", init: function() { document.addEventListener("click", event => this.doSomething(event.type), false); }, doSomething: function(type) { console.log("Handling " + type + " for " + this.id); } };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/51980.html
摘要:根據各自執行時機的不同來選擇采用哪種方案。不可以當作構造函數,也就是說,不可以使用命令,否則會拋出一個錯誤。不可以使用對象,該對象在函數體內不存在。不能使用箭頭函數可以讓里面的,綁定定義時所在的作用域,而不是指向運行時所在的作用域。 this是什么 this就是函數內部的關鍵字 看下面例子理解js中的this // 例子1 function fnOne () { ...
摘要:人工智能技術的初步應用隨著網絡強國戰略思想加強網絡內容建設等指導思想的推出和強化,內容安全已經成為互聯網企業生存和發展的生命線。 歡迎訪問網易云社區,了解更多網易技術產品運營經驗。 10月16日,2018年 AIIA人工智能開發者大會在蘇州舉辦。會議邀請了國內外人工智能產業知名人物、國家政府主管部門、行業內頂尖企業、知名學者代表、開源社區優秀貢獻團隊及個人,共同交流了技術現狀趨勢、生態...
摘要:為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習一微信小程序的特點張小龍張小龍全面闡述小程序,推薦通讀此文小程序是一種不需要下載安裝即可使用的應用,它出現了觸手可及的夢想,用戶掃一掃或者搜一下即 為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習; 一:微信小程序的特點 張小龍:張小龍全面闡述小程...
摘要:為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習一微信小程序的特點張小龍張小龍全面闡述小程序,推薦通讀此文小程序是一種不需要下載安裝即可使用的應用,它出現了觸手可及的夢想,用戶掃一掃或者搜一下即 為了方便大家了解并入門微信小程序,我將一些可能會需要的知識,列在這里,讓大家方便的從零開始學習; 一:微信小程序的特點 張小龍:張小龍全面闡述小程...
閱讀 3870·2021-09-10 11:22
閱讀 2325·2021-09-03 10:30
閱讀 3660·2019-08-30 15:55
閱讀 1873·2019-08-30 15:44
閱讀 841·2019-08-30 15:44
閱讀 582·2019-08-30 14:04
閱讀 3042·2019-08-29 17:18
閱讀 1262·2019-08-29 15:04