js 雜症,this with 變數提升

来源:http://www.cnblogs.com/suyuan1573/archive/2017/02/18/6412970.html
-Advertisement-
Play Games

一、this.xx 和 xx 是兩回事 受後端語言影響,總把this.xx 和xx 當中一回事,認為在function中,xx 就是this.xx,其實完全兩回事; this.xx 是沿著this 原型鏈找變數,xx是沿著作用域鏈找變數 var func = function(){ console. ...


一、this.xx 和 xx 是兩回事

受後端語言影響,總把this.xx 和xx 當中一回事,認為在function中,xx 就是this.xx,其實完全兩回事;

this.xx 是沿著this 原型鏈找變數,xx是沿著作用域鏈找變數

var func = function(){
console.info(this);
}

var func1 = function(){
function func11(){
console.info(this) // 應該是func1
this.func(); // this 是window
func(); // windows 輸出    
}
console.info(this)
func11(); // 全局調用,func11 裡面的this是全局對象window, 見下麵的2
//this.func11(); //失敗,this是window,沒有func11方法
}

func1()
View Code

 

元原型鏈:this.xxx 的時候會沿著原型鏈查找,繼承可以通過原型鏈實現

作用域鏈:xxx 的時候會沿著作用域鏈查找,with 會設置作用域鏈最底層


二、this代表啥
this對象根據不同的調用方式,所綁定的對象也是不同的。
函數調用有四種:

1. 方法模式的調用:當一個函數被保存為一個對象的屬性時,我們稱這個函數為一個方法。當一個方法被調用時,this綁定到該對象。

var p = {func: func1}
p.func()// func1中的this就p

2. 函數模式的調用:當一個函數並非一個對象的屬性時,那麼它就被當作一個函數來調用,this被綁定到全局對象。

3. 構造器模式的調用:如果一個函數前面帶上new來調用,那麼將創建一個隱藏連接到該函數的prototype成員的新對象,同時this被綁定到這個新對象上。

function person(){
console.info(this);
this.age = 10;
}
var a = new person()

 

4. apply模式的調用:apply方法接收兩個參數,第一個被綁定到this,第二個是參數數組。什麼也不傳時,預設this綁定到全局對象。

var person = function(){
this.age = 10;
this.say = function(){console.info(this.age)}
}

var zl = function(){
person.call(this)
console.info(this)
}

var a = new zl()

 

// 下麵這個其實是錯誤的繼承,涉及到變數提升,

var person;
var zl;
person = function(){
this.age = 10;
this.say = function(){

console.info(this.age)

}
}
zl = function(){
console.info(zl);//其實是給zl 加了屬性、方法
person.call(zl);
}
// 執行
var a = new zl() // 執行時候,zl, person 都已經定義出來了,在執行zl() 的時候,會沿著作用域鏈找到zl

 

三、變數提升

-----------------
say()
console.info(a);


function say(){
console.info(111)
}

var a = 100;


-----------js解析後為,然後其實是執行下麵的代碼---------
function say(){
console.info(111)
}
var a;

say()
console.info(a)
a = 100;

 

四、一個奇怪的事情,with,變數提升,this

({
x: 10,
foo: function () {
function bar() {
console.log(x);
console.log(y);
console.log(this.x);
}
with (this) {
var x = 20;
var y = 30;
bar.call(this);
}
}
}).foo();

 


----js引擎解析翻譯後----

({
x: 10,
foo: function () {
var x;
var y;
function bar() {
console.log(x); // 沿著作用域找到了foo 下麵的x=undefined
console.log(y); // 沿著作用域鏈找到 foo 下麵的 y=30
console.log(this.x);// this 是最外面的對象,x 已經改為20
}
with (this) {
x = 20; //this是最外面的對象,有x,其實是賦值給了this.x, 10變成20
y = 30; // this 沒有y,沿著作用域鏈找到 foo 下麵的y, undefine 變成30

bar.call(this);
}
}
}).foo();

 

輸出:

undefine

30

20

題目來自  http://luopq.com/2016/02/14/js-with-keyword/ 

 

 


http://luopq.com/2016/02/14/js-with-keyword/


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

-Advertisement-
Play Games
更多相關文章
  • 動態顯示目錄的作用 不用每次寫博客的時候繁瑣的人工整理目錄,又可以動態浮動在右下角,方便快速跳到感興趣的位置同時也可以快速的對文章內容有一個大概的瞭解。 實現原理 首先根據個人喜好,我習慣了用 h1 來做分類。所以本篇內容也主要是針對h1來提取目錄。 如何提取出來h1呢? 先來看這張圖,以獵豹瀏覽器 ...
  • 一、為什麼使用RequireJS? <script src="a.js"></script> <script src="b.js"></script> <script src="c.js"></script> <script src="b.js"></script> <script src="c.j ...
  • 個人在移動端的一些總結歸納,有新的知識點會一直更新 一.css部分 1.meta標簽 <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=no"/> 移動端加上這個標簽才是真正的自適應,不加的 ...
  • 1 . 相對定位relative:顧名思義,相對定位是相對於自己的位置來進行偏移,如下圖: 以盒子中心為基準,為每條邊的正方向,例: 向右移動20px : 代碼為left:20px;或者right:-20px; 向下移動20px : 代碼為top:20px;或者bottom:-20px; 2 . 絕 ...
  • 直入正題,JS打開攝像頭並截圖上傳至後端的一個完整步驟 1. 打開攝像頭主要用到getUserMedia方法,然後將獲取到的媒體流置入video標簽 2. 截取圖片主要用到canvas繪圖,使用drawImage方法將video的內容繪至canvas中 3. 將截取的內容上傳至伺服器,將canvas ...
  • 下麵舉一些小例子: 先假設的創建一個上下文環境 1.canvas做灰色圖像: 個人認為主要的知識點在於: (1)獲取當前畫布中圖像的各個像素點的值; (2)灰色圖像的求解方式(r+g+b)/3,再將這個值賦給原來的像素的R、G、B; (3)在用新的顏色值畫一張圖片 2.canvas刮刮樂 個人認為主 ...
  • No1. 必須搭建java環境 只需要最基礎的java環境,也就是cmd下可以運行java和javac即可, 具體教程請自行百度,都會有很詳細的教程,這裡不重點介紹。 No2. 下載安裝HBuilder 請在這裡下載HBuilder:http://www.dcloud.io/, 下載完成後請將zip ...
  • [1]效果演示 [2]原理解釋 [3]具體實現 [4]插件代碼 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...