javascript中的this

来源:http://www.cnblogs.com/gongyue/archive/2017/12/02/7954644.html
-Advertisement-
Play Games

s中的this總是讓人,是js眾所周知的坑之一。 總結一下,this的坑分為5種。 1.全局代碼中的this。 alert(this);//window 全局範圍內this將會全局,在瀏覽器window 2.作為單純函數調用 這裡this指向全局對象,就是window。在嚴格模式中,則undefie ...


s中的this總是讓人,是js眾所周知的坑之一。
總結一下,this的坑分為5種。
1.全局代碼中的this。
alert(this);//window
全局範圍內this將會全局,在瀏覽器window

2.作為單純函數調用

function foo(x){
    this.x = x;
}
foo(99);
alert(x);//全局變數x值為99

 

 

這裡this指向全局對象,就是window。在嚴格模式中,則undefiend。

3.作為對象的方法調用

var name = "xiaoming";
var person = {
    name:"xiaohong",
    hello:function(sth){
        console.log(this.name + "says" + sth);
    }
}
person.hello("hello world");

 

輸出 xiaohong says hello world。this指向person對象,即當前對象。

4.作為構造函數
new Foo();
function Foo(){
this.name = “fooname”;
}
構造函數內部的this指向新創建的對象

5.內部函數

var name = "xiaoming";
var person = {
    name:"xiaohong",
    hello:function(sth){
        var sayhello = function(sth){
            console.log(this.name + "says" + sth);
        }
        sayhello(sth);
    }
}
person.hello("hello world");

 

 

在內部函數中,this沒有按預想的綁定到外層函數對象上,而是綁定到了全局對象。這裡普 遍被認為是 JavaScript語言的設計錯誤,因為沒有人想讓內部函數中的 this指向全局對象。 一般的處理方式是將 this作為變數保存下來,一般約定為 that或者 self

var name = "xiaoming";
var person = {
    name:"xiaohong",
    hello:function(sth){
        var that = this;
        var sayhello = function(sth){
            console.log(that.name + "says" + sth);
        }
        sayhello(sth);
    }
}
person.hello("hello world");

 

6.使用call和apply設置this 

person.hello.call(person, “world”);
apply和 call類似,只是後面的參數是通過一個數組傳入,而不是分開傳入。兩者的方法定義:
call(thisArg[,arg1,arg2,…]); // 參數列表,arg1,arg2,…
apply(thisArg [,argArray] ); // 參數數組,argArray
兩者都是將某個函數綁定到某個具體對象上使用,自然此時的 this會被顯式的設置為第一 個參數。

我們可能經常會寫這樣的代碼:
$(“#ele”).click=obj.handler;

如果在 handler中用了 this,this會綁定在 obj上麽?顯然不是,賦值以後,函數是在回調中執行的,this會綁定到$(“#ele”)元素上。
這邊介紹一個bind方法

var name = "xiaoming";
        var person = {
            name:"xiaohong",
            hello:function(sth){
                var that = this;
                var sayhello = function(sth){
                    console.log(that.name + "says" + sth);
                }
                sayhello(sth);
            }
        }

var odiv = document.getElementById("odiv");
odiv.onclick=person.hello.bind(person,"hello world");//xiaohong says hello world

 

bind方法和call/apply方法一樣,不同的就是bind方法不執行,只是拷貝代碼。用這個方法可以改變this指向,this指向的不再是odiv而是person。


web前端/H5/javascript學習群:250777811 歡迎大家關註我的微信號公眾號,公眾號名稱:web前端EDU。掃下麵的二維碼或者收藏下麵的二維碼關註吧(長按下麵的二維碼圖片、並選擇識別圖中的二維碼)

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [toc] 功能和特性 基於socket實現的c/s架構的的通信 伺服器和客戶心跳連接 gson實現的消息通信機制 註冊及登錄 支持私聊和群聊。 動態更新用戶列表以及用戶消息提示 支持emoji表情,以及emoji表情選擇器 伺服器端資料庫用戶記錄 ~~實現文件傳輸~~ ~~文件記錄~~ 功能展示 ...
  • 寫什麼?為什麼寫?寫給誰看?這個是寫博客的首要問題。 寫什麼? 在這個分類下的文章主要是講一些博主對於JDK9的源碼理解結合一些入門級的數據結構與演算法。引用和知識來源主要來源於 CLRS(演算法導論),Alogrithms( 演算法 普林斯頓大學教材 鏈接:https://algs4.cs.prince ...
  • 文章目錄 ★引子 ★求導 ★最初的想法 ★初步的想法 ★後來的想法 ★最後的想法 ★編程範式 ★結尾 首先聲明一點,本文主要介紹的是面向對象(OO)的思想,順便談下函數式編程,而不是教你如何準確地、科學地用java求出函數在一點的導數。 ★引子 首先,直接上一段python代碼,請大家先分析下上面代 ...
  • 熔斷與降級 為什麼在RPC環節中有熔斷以及降級的需求,詳細的原因這裡不多解釋,從網上搜索一張圖做示意。 熔斷 我理解熔段主要解決如下幾個問題: 當所依賴的對象不穩定時,能夠起到快速失敗的目的 快速失敗後,能夠根據一定的演算法動態試探所依賴對象是否恢復 比如產品詳細頁獲取產品的好評總數時,由於後端服務異 ...
  • 你可能會疑惑為什麼我們使用6位數來表示一種顏色而不是只用一位或二位,答案是使用6位數可提供給我們巨大數量的顏色變化。 會有多少種可能的顏色?16 個值(0~F)和 6 個位置意味著我們有 16 的 6 次方,或者說超過 1600 萬種可能的顏色。 Hex code 遵循 red-green-blue ...
  • 很多情況下,你會使用 CSS 庫,這些庫可能會意外覆蓋掉你自己的 CSS。所以當你需要確保某元素具有指定的 CSS 時,你可以使用 !important。 Hello World!是粉色的 ...
  • 1、js的簡介 (1)js是什麼? js是可以嵌入到html中,是基於對象和事件驅動的腳本語言。 特點: 交互性 安全性:js不能訪問本地磁碟 跨平臺:瀏覽器中都具備js解析器 (2)js能做什麼 js能動態的修改(增刪)html和css的代碼 能動態的校驗數據 (3)js的歷史及組成 BOM(瀏覽 ...
  • 內容為整理博主文章: "https://juejin.im/user/58870f04128fe10065efc8d9/article" 個人覺得他對Operators的解說較容易理解和全面,顧把它們整理在一起,也方面查找。 Operators: Observable 的 Operators 是實例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...