javascript this指針指向?

前言

理解javascript的指針就需要先了解js的執行環境和作用域!執行環境的定義了變量或函數有權訪問的其他數據,決定了它們各自的行為。每個執行環境都有一個與之關聯的變量對象,環境中定義的所有的變量和函數都保存在這個對象中。雖然我們編寫的代碼無法訪問這個對象,但解析器在處理數據時會在后臺使用它。

1、全局執行環境

全局執行環境是最外圍的一個執行環境,根據js實現的宿主環境的不同,表示執行環境的對象也不一樣。在web瀏覽器中認為window就是全局執行的對象。因此所有的全局變量和函數都是作為window對象進行創建的。某個執行環境中的所有代碼執行完畢后,該環境被銷毀,保存在其中的所有的變量和函數定義也會被銷毀。每個函數都有自己的執行環境,當執行流進入一個函數的時候,函數的環境就會被推入一個環境棧中。而在函數執行之后,棧將其環境彈出。

2、作用域鏈

當代碼在一個環境中執行時候,會創建變量的一個作用域鏈(scope chain)。作用域鏈的用途,是保證對執行環境有權訪問的所有的變量和函數的有序訪問。作用域鏈的前端,始終都是當前執行的代碼所在的環境的變量對象,如果這個環境是函數,則將其活動對象作為變量對象。活動對象在最開始的時候只包含一個變量,arguments對象。作用域鏈的下一個對象來自包含(外部)環境,而再下一個對象則來自下一個包含對象,這樣一直延續到全局。

JavaScript由于其在運行期進行綁定的特性,JavaScript 中的 this 可以是全局對象、當前對象或者任意對象,這完全取決于函數的調用方式。JavaScript 中函數的調用有以下幾種方式:作為對象方法調用,作為函數調用,作為構造函數調用,和使用 apply 或 call 調用。

看下面第一個例子

var point = {?
? ? ? x : 0,?
? ? ? y : 0,?
? ? ?moveTo : function(x, y) {?
? ? ? ? ? ? ? ? ? ? ?console.log(this);//1
? ? ? ? ? ? ? ? ? ? ?this.x = this.x + x;?
? ? ? ? ? ? ? ? ? ? ?this.y = this.y + y;?
? ? ? ? ? ? ?}?
? ?};
point.moveTo(1,1); //this 綁定到當前對象,即point對象
console.log(point);//2

第一個位置上的this我們打印的時候發現這里的this指向就是point 這個對象!

point.moveTo()這個方法執行后就更改了對象point的屬性x和y

第二個例子

function func(x) {?
? ? ? ?this.x = x;
? ? ? console.log(this);
}?
func(2);

我們發現這個時候的this指向是window ?why?

這個很好理解,func(2) 可以寫成window.func(2);由于任何函數或者全局的屬性都是window對象下面的,那么這里的this當然就是window

第三個例子

var point = {?
? ? ? x : 0,?
? ? ? y : 0,?
? ? ? moveTo : function(x, y) {?
? ? ? ? ? ? ? ? ? ? ? // 內部函數
? ? ? ? ? ? ? ? ? ? ?var moveX = function(x) {?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? console.log(this);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.x = x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };?
? ? ? ? ? ? ? ? ? ? ?// 內部函數
? ? ? ? ? ? ? ? ? ? ?var moveY = function(y) {?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? this.y = y;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?console.log(this);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };?
? ? ? ? ? ? ? ? ? ? moveX(x);?
? ? ? ? ? ? ? ? ? ? console.log(moveX() in point);//false
? ? ? ? ? ? ? ? ? ? console.log(moveX() in window);//true
? ? ? ? ? ? ? ? ? ? moveY(y);?
? ? ? ? ? }?
};?
point.moveTo(1,1);?
point.x; //=>0?
point.y; //=>0

上面的代碼我們分析下很好理解!執行point.moveTo(1,1)里面有兩個方法,moveX和moveY,這兩個方法并沒有綁定到對象point上,我們知道所有的方法都是屬于window對象的,那么這里的moveX和moveY實際上是window上調用的,并不是屬于point對象!

第四個例子

function Point(x,y){?
? ? ? ? ? console.log(this);//第一次是通過new創建的,返回的是Point{} 它是一個對象,不是單純的方法了
? ? ? ? ? this.x = x; // this ?
? ? ? ? ?this.y = y; // this ?
}
var np=new Point(1,1);//所以這里可以理解成這樣
/*
? ? ? ? ? ?var np = {
? ? ? ? ? ? ? ? ? ? ? x = 1,
? ? ? ? ? ? ? ? ? ? ? y =1
? ? ? ? ? ? ? ?};
*/
np.x;//1
var p=Point(2,2);//這個時候不是通過new創建,就相當于window.Point(2,2),它就綁定到window上了!所以this指向window
console.log(p);//由于函數Point沒有返回值,所以這里的p = undefined
p.x;//error, p是一個空對象undefined

總結:

調用形式
this指向
普通函數全局對象window
對象的方法該對象
構造函數新構造的對象

文章參考地址:

http://www.cnblogs.com/isaboy/?

http://www.cnblogs.com/isaboy/archive/2015/10/29/javascript_this.html

轉載于:https://www.cnblogs.com/shizhouyu/p/4952615.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

能源局將提高光伏“領跑者”項目技術指標

記者從權威渠道獲悉,國家能源局正計劃對光伏“領跑者”中有關單多晶的轉換效率標準等細節進行修改。“領跑者”計劃中,光電轉換效率的修訂工作將在今年3月底展開,主要向各大相關機構、企業征求意見,如果爭議較多,定稿時…

phpize增加php模塊

一,phpize的好處 什么時候我們要用phpize呢?我們在安裝php時: ./configure --prefix/usr/local/php --with-mysql/usr/local/mysql --with-zlib-dir --with-freetype-dir/usr --with-jpeg-dir/usr --with-png-dir/usr --enable-gd-native-ttf…

java安全權限配置_使用Spring安全表達式控制系統功能訪問權限問題

一、SPEL表達式權限控制從spring security 3.0開始已經可以使用spring Expression表達式來控制授權,允許在表達式中使用復雜的布爾邏輯來控制訪問的權限。Spring Security可用表達式對象的基類是SecurityExpressionRoot。表達式函數描述hasRole([role])用戶擁有指定…

SlidingMenu的使用,結合Fragment(eclipse環境)

首先下載SlidingMenu,有Library和Sample,然后在自己的項目中引入類庫(引入智慧北京工作空間的Library),然后V4包會發生沖突,刪掉自己項目Libs目錄下的V4包即可 側滑布局和主界面布局都先用一個空布局填充一…

log4j日志文件配置說明及使用

一.log4j.properties文件格式說明: log4j.rootLoggerinfo, stdoutlog4j.appender.stdoutorg.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layoutorg.apache.log4j.PatternLayout# Pattern to output the callers file name and line number.log4j.appende…

java如何做全局緩存_傳智播客JNI第七講 – JNI中的全局引用/局部引用/弱全局引用、緩存jfieldID和jmethodID的兩種方式...

講解JNI中的全局引用/局部引用/弱全局引用、緩存jfieldID和jmethodID的兩種方式,并編寫兩種緩存方式的示例代碼。1.從Java虛擬機創建的對象傳到本地C/C代碼時會產生引用,根據Java的垃圾回收機制,只要有引用存在就不會出發該引用指向的Java對象…

起一卦,還是那個破事。還是大兇。

公元:2013年6月20日11時48分46秒 陽3局農歷:2013年05月12日11時48分芒種:2013-6-5 20:44:00 小暑:2013-7-7 7:09:00干支:癸巳年 戊午月 丁巳日 丙午時 旬空:午未空 子丑空 子丑空 寅卯空直符&#…

老工業基地調整改造與振興

老工業基地調整改造與振興 一、運用“兩只手”,加快工業結構調整 一方面,運用市場機制即“看不見的手”進行調整。通過市場競爭機制、價格波動機糾、供求均衡機制、優勝劣汰機制等,實現資源的合理流動和優化配置。 另一方面,運用宏…

如何使用DNS反向映射來掃描IPv6地址?

目前增加的IPv6地址空間不僅提高了對啟發式算法的使用(執行IPv6地址掃描時),而且還推動了人們探索替代技術用于查找IPv6節點。本文中我們將探討如何使用一種極其強大的向量來發現IPv6節點:使用DNS反向映射。 IPv6地址掃描攻擊通常…

java jre下載安裝教程_java JRE下載、安裝以及環境變量教程

java JRE下載、安裝以及環境變量教程作者:小丸子 來源:PC下載網時間:2017-10-17 19:12:33JRE也就是(Java Runtime Environment)Java運行環境,是運行JAVA程序所必須的環境的集合,包含各種類庫。今天PC下載網小編為您介紹jre的下載 安裝 跟環境變量的配置1…

java環境變量設置與java查看安裝路徑

把jdk安裝到計算機中之后,我們來進行設置使java環境能夠使用。 首先右鍵點我的電腦。打開屬性。然后選擇“高級”里面的“環境變量”,在新的打開界面中的系統變量需要設置三個屬性“JAVA_HOME”、 “path”、“classpath”,其中在沒安裝過jdk的環境下。p…

C#設計模式學習筆記-單例模式

C#設計模式學習筆記-單例模式 最近在學設計模式,學到創建型模式的時候,碰到單例模式(或叫單件模式),現在整理一下筆記。 在《Design Patterns:Elements of Resuable Object-Oriented Software》中的定義是&…

kotlin為什么比java編譯慢_為什么Kotlin編譯速度比Scala快? [關閉]

雖然我認為這個問題不適合Stack Overflow,因為它傾向于主要產生基于意見的答案,但這里有一個嘗試:你有兩種不同的語言,特別是關于類型系統,以及兩個完全獨立的編譯器實現 . 所以期望它們具有“相同”的編譯速度已經是一…

錫山國土推行數據中心“在線變更”

為全面提高全區土地變更工作效率,國土錫山分局全面推行數據中心在線變更。由不動產登記科利用數據中心管理平臺,將遙感影像、監測信息以及監測圖斑的土地利用現狀信息、土地利用總體規劃信息錄入“數據中心”,制定我區的變更調查工作方案&…

Linux 安裝loadrunner 碰到的問題

關于linux下面搭建loadrunner的詳細步驟: http://blog.sina.com.cn/s/blog_9aa583cf0101bu4y.html http://hi.baidu.com/higkoo/item/d75027acc78bab3e030a4dde?qq-pf-topcqq.c2c http://www.cnblogs.com/xiaoTT/archive/2012/02/15/2352127.html 用控制臺加載負載…

數據分析真的能驅動用戶快速增長嗎?

俗話說,“酒香不怕巷子深”;俗話又說,“酒香也怕巷子深” 。再后來,俗話還說,管他酒香不香巷子深不深,只要找個算盤技巧神乎其神的賬房先生,即數據科學家,酒就可以大賣了。這叫做用數據驅動用戶…

java 常見bug_java常見bug

org.hibernate.QueryException: could not resolve property: menuId of:無法解析menuId 字段,是指這個字段有錯Servlet.service() for servlet default threw exception09:28:54,704 ERROR [CoyoteAdapter] An exception or error occurred in the container durin…

解決啟動Biee控制臺亂碼問題

解決啟動Biee控制臺亂碼問題 在安裝完Biee后,大家都可以看到在程序中可以找到啟動BI服務的地方 點擊上圖中的啟動bi服務則在window系統中會彈出一個dos窗口,來顯示執行啟動服務的操作,如下圖 上圖顯示的是正常情況,本人安裝后首次…

“北航Clubs” Alpha版發布!

一、功能 1.獲取活動信息: 用戶進入網站后,第一眼就可以查看到近期活動 2.查看活動詳情 點擊活動標題,可以進入活動詳情頁面 3.注冊功能 首頁點擊注冊,輸入學號、密碼、姓名、手機號即可完成注冊 4.用戶登陸 擁有賬號之后&#xf…

物聯網與零邊際成本共享經濟

物聯網是由通訊網絡、能源網絡、物流網絡組成,這些網絡共同在單一操作系統中合作,持續尋找各種方法來提升資源整編、生產及配送商品和服務,以及廢棄物回收等過程中的熱力效率和生產力;這三種網絡相輔相成,缺一不可。若缺乏通訊&am…