你不知道的javascript(上卷)----讀書筆記

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>你不知道的javascript(上卷)</title>
</head><body><script type="text/javascript">/*//9、this 的全面解析this的綁定和函數聲明位置沒有任何關系,之取決于函數的調用方式在理解this的綁定過程之前,首先理解調用位置:調用位置就是在代碼中被調用的位置(問不是聲明位置,)。只有仔細分析調用位置才能回答這個問題:這個this到底引用的是什么通常來說,尋找調用位置就是尋找“函數被調用的位置”2.1、函數調用位置function baz(){console.log("baz");  bar();  //bar的調用位置}function bar(){console.log("bar");foo();//foo的調用位置}function foo(){console.log("foo");}baz();//baz的調用位置b、函數調用位置2function foo(){console.log(this.a);}var a = 2;//2foo();function foo(){"use strict";console.log(this.a);  //報錯,嚴格模式下,this不會默認綁定給window}var a = 2;foo();function foo(){console.log(this.a);}var a = 2;(function(){"use strict";foo(); //2})();//三種情況下,只要函數執行不是執行在嚴格模式下,默認綁定才會綁定到全局上2.2、綁定規則2.2.1默認綁定function foo(){console.log(this.a);}var a = 2;foo();//2//非嚴格模式下,this默認綁定在window下function foo(){"use strict";console.log(this.a);}var a = 2;foo();// this is not defined;//嚴格模式下不能將全局對象默認綁定,因此this會綁定到undefined上function foo(){console.log(this.a);}var  a = 2;(function(){"use strict";foo();//2 })()//嚴格模式下的調用不影響默認綁定2.2.2隱式綁定function foo(){console.log(this.a);}var obj = {a : 2,foo : foo}obj.foo();//無論是直接在obj中定義還是先定義在添加為引用屬性,這個函數嚴格來說不屬于obj對象,//調用位置會使得obj上下文來引用函數,因此你可以說函數被調用時obj對象“擁有”或者“包含”函數function foo(){console.log(this.a);}var obj2 = {a : 42,foo : foo}var obj1 = {a : 2,obj2 : obj2}obj1.obj2.foo();//42//對象屬性引用鏈中只有上一層或者說最后一層在調用位置中起作用。//隱式丟失function foo(){console.log(this.a);}var obj = {a : 2,foo : foo}var bar = obj.foo;//函數別名var a = "oops,global";bar();//"oops,global";2.2.3顯示綁定function foo(){console.log(this.a);}var obj = {a : 2,}foo.call(obj);//2//通過foo.call(..),我們可以調用foo時強制把他的this綁定到obj上//硬綁定 function foo(){console.log(this.a);}var obj = {a : 2,}var bar = function(){foo.call(obj);}bar();//2setTimeout(bar,1000);//2bar.call(window);//2//硬綁定的bar不可能在修改他的this//創建函數bar(),并且在內部手動調用foo.call(obj),//因此強制把foo的this綁定到obj,無論后面我們如何調用到bar(),//他總會手動在obj上調用foo,這種綁定是一種顯性綁定,因此我們稱之為硬綁定//API調用的‘上下文’function foo(el){console.log(el,this.id); //1 awesome 2 awesome 3 awesome}var obj = {id : "awesome",}//調用foo()時把this綁定到objvar arr = [1,2,3].forEach(foo,obj);//console.log(arr);new 綁定使用new調用函數,會執行以下操作1、創建(或者說構造)一個全新的對象2、這個新對象會被執行[[Protoptye]]連接3、這個新的對象會綁定到函數調用的this4、如果函數沒有返回其他對象,那么new表達式中的函數調用會自動返回這個新的對象function foo(a){this.a = a;}var bar = new foo(2);console.log(bar.a);2.3優先級默認綁定 < 隱式綁定 < 顯式綁定 < new ....2.4被忽略的thisfunction foo(){console.log(this.a);}var a = 2;foo.call(null);//2//call 參數為null或者undefined的時候會默認是全局this柯里化。。。。*//*8、this詞法 var foo = a =>{  console.log(a);}foo(2); //2//箭頭函數,是根據為層(函數或者全局)作用域來決定thisvar foo1 = function(a){console.log(a);}foo1(2);// 兩種聲明是等效的var obj = {id : "awesome",cool:function coolFn(){console.log(this.id)}};var id = "not awesome";obj.cool(); //awesomesetTimeout(obj.cool,100); // not awesome // setTimeout 導致 cool()函數丟失了同this之間的綁定//解決方案var obj = {count : 0,cool: function coolFn(){var self = this;if(self.count<1){setTimeout(function timer(){self.count++;console.log("awesome");},100);}}}obj.cool(); // awesome*//*//7、動態作用域function foo(){console.log(a);}function bar(){var a = 3;foo();}var a = 2;bar();  //2  輸出結果是2,詞法作用域讓foo()中的a通過RHS引用到了全局//作用域中的a,因此會輸出2function foo(){console.log(a); //a is not defined}function bar(){var a = 3;foo();}bar();function foo(){var a  = 3;console.log(a); //引用的是局部變量a的值}var a = 1;foo();// 3*//*//5、閉包作用域function foo(){var a = 2;function bar(){console.log(a);}return bar;}var baz = foo();baz(); //2 foo() 的返回值是bar()函數,所以通過baz()可以執行這個函數function foo(){var a = 2;function baz(){console.log(a);}bar(baz);} function bar(fn){fn();  }foo();//2  foofor(var i = 0;i<=5;i++){(function(){var j = i;setTimeout(function time(){console.log(j);  // 每100毫秒輸出一個數,分別輸出0,1,2,3,4},j*100);})()}for(var i = 0;i<=5;i++){(function(j){setTimeout(function time(){console.log(j); // 每100毫秒輸出一個數,分別輸出0,1,2,3,4},j*100);})(i)}for(var i = 1;i<=5;i++){(function(){setTimeout(function time(){console.log(i); // 每100毫秒輸出一個數,分別輸出6,6,6,6,6},i*100);})()}*//*//4、提升 --先編譯在執行a = 2;var a;console.log(a);//a  因為var聲明的變量存在提升console.log(b); //undefined var聲明存在提升,賦值不存在提升,所以b存在但是沒賦值var b = 2;foo();  //函數竟然可以執行,說明函數聲明也提升了function foo(){console.log(a); //undefined , 聲明提升了,不存在賦值提升var a = 2;}foo(); //1  var foo;function foo(){console.log(1);}foo = function(){console.log(2)}//引擎編譯如下function foo(){console.log(1);}foo(); //1  var foo = function(){console.log(2)}foo(); //3//var foo 盡管出現在在function之前,但是由于是重復聲明,所以被忽略掉//函數聲明會被提升到普通變量之前function foo(){console.log(1);}var foo = function(){console.log(2);}function foo(){console.log(3);}foo();  // foo is not a functionvar a = true;if(a){function foo(){console.log("A");}}else{function foo(){console.log("B");}}*//*//3.4.3、let和var的區別for(var i = 0;i<10;i++){}console.log(i);// 10for(let j=0;j<10;j++){}console.log(j);// j is not defined//for循環結束后i并沒有被銷毀,導致全局污染*//*//3.3.2、立即執行函數:抱在一對括號內var a = 2;(function foo(){var a = 3;console.log(a); //3})();console.log(a);// 2*//*//塊級作用域,函數作用域//3.2、規避沖突*//*function foo(){function bar(a){i = 3;console.log(a+i);}for(var i = 0;i<10;i++){bar(i*2);}}foo();//死循環,bar中的i覆蓋了for循環中的i導致死循環*//*//2.2.1、evalfunction foo(str,a){ eval(str);console.log(a,b); //4}var b = 2;var result = foo("var b = 3;",1);console.log("result:",result); //undefined???默認嚴格模式?//書上的結果是1,3因為eval(str)== var  b = 3; 讀取的是局部變量3function foo(str){"use strict";eval(str);console.log(a);}foo("var a = 2");//a si not defined*/</script>
</body></html>

  

轉載于:https://www.cnblogs.com/SunlikeLWL/p/7376458.html

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

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

相關文章

lightgbm 數據不平衡_不平衡數據下的機器學習(下)

本文從不平衡學習的基礎概念和問題定義出發&#xff0c;介紹了幾類常見的不平衡學習算法和部分研究成果。總體來說&#xff0c;不平衡學習是一個很廣闊的研究領域&#xff0c;但受筆者能力和篇幅的限制&#xff0c;本文僅對其中部分內容做了簡單概述&#xff0c;有興趣深入學習…

netty實現高性能文件服務器,通用文件服務組件(Netty實現版本)

本文所述文件服務組件在筆者此前一篇文章中已有闡述(基于netty的文件上傳下載組件)&#xff0c;不過本文將基于之前這個實現再次進行升級改造&#xff0c;利用基于注解的方式進行自動裝配。1. 簡介1.1 Netty簡介Netty是一個異步事件驅動的網絡應用程序框架&#xff0c;用于快速…

leetcode343. 整數拆分(動態規劃)

給定一個正整數 n&#xff0c;將其拆分為至少兩個正整數的和&#xff0c;并使這些整數的乘積最大化。 返回你可以獲得的最大乘積。 示例 1: 輸入: 2 輸出: 1 解釋: 2 1 1, 1 1 1。 解題思路 組成整數兩個數可以進一步拆分&#xff0c;所以可以運用到動態規劃&#xff0c…

愛前端2018全棧大前端_啟動2018年前端工具調查

愛前端2018全棧大前端by Ashley Watson-Nolan通過阿什利沃森-諾蘭 啟動2018年前端工具調查 (Launching the Front-End Tooling Survey 2018) The Front-End Tooling Survey is back to gather input and shed some light on the tooling habits across the web development in…

PHP 小數點保留兩位【轉】

最近在做統計這一塊內容&#xff0c;接觸關于數字的數據比較多&#xff0c; 用到了三個函數來是 數字保留小數后 N 位&#xff1b; 接下來簡單的介紹一下三個函數&#xff1a; 1、number_format echo number_format("5000000")."<br>"; echo number_…

華為杯數學建模2020獲獎名單_我校在2020年全國大學生數學建模競賽中再獲佳績(內附獲獎名單)...

# 近日&#xff0c;從全國大學生數學建模競賽組委會獲悉&#xff0c;我校在2020年全國大學生數學建模競賽中獲得5項國家二等獎。國家獎獲獎數量在全國農林院校中并列排名第二。在黑龍江省高校中位居第三名。1你的喜悅&#xff0c;我們的欣慰# 2020年全國大學生數學建模競賽于9月…

Python 面試總結

公司面試&#xff1a; 1&#xff0c;說說項目都用到了什么技術&#xff1f; 2&#xff0c;mysql索引的種類&#xff1f; 3&#xff0c;索引建多有什么不好&#xff1f; 4&#xff0c;mysql的引擎有什么&#xff1f; 5&#xff0c;redis是單線程還是多線程的? 6, redis的持久化…

醫療器械監管系統總結

算算時間畢業也兩個多月了&#xff0c;心也慢慢塌下來了&#xff0c;少了些許的浮躁&#xff0c;增加了些許的淡定&#xff0c;同時也添加了一些不好的習氣&#xff0c;“混”&#xff0c;混日子的混&#xff0c;生活慢慢的缺少了激情&#xff0c;伴隨著和她漸漸的疏遠。昨天聽…

fn映射 mac 鍵盤_【新鮮評測】高顏值、低延遲、多模式跨平臺辦公神器-米物藍牙鍵盤...

首先&#xff0c;要例行感謝糖紙眾測&#xff0c;感謝麻麻醬給我這次評測機會。大家可以微信搜索【糖紙】小程序免費體驗更多科技產品。小米旗下生態鏈公司米物最近出了一款藍牙雙模鍵盤&#xff0c;它作為一個85全鍵鍵盤&#xff0c;可以完成藍牙和USB轉換&#xff0c;以及PC和…

leetcode413. 等差數列劃分(動態規劃)

數組 A 包含 N 個數&#xff0c;且索引從0開始。數組 A 的一個子數組劃分為數組 (P, Q)&#xff0c;P 與 Q 是整數且滿足 0<P<Q<N 。 如果滿足以下條件&#xff0c;則稱子數組(P, Q)為等差數組&#xff1a; 元素 A[P], A[p 1], …, A[Q - 1], A[Q] 是等差的。并且 …

(轉發)python3用matplotlib繪圖出現中文亂碼的問題

from pandas import Series,DataFrame import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif] [SimHei] 字體的選擇如下&#xff1a; 黑體 SimHei微軟雅黑 Microsoft YaHei微軟正黑體 Microsoft JhengHei新宋體 NSimSun新細明體 PMingLiU細明…

小程序 input 換行_小程序 input雙向數據綁定

小程序 雙向綁定數據&#xff08;單個&#xff09;<小程序 雙向綁定數據&#xff08;多個&#xff09;<

平面設計 前端_我如何在5個月內從平面設計師過渡到前端開發人員

平面設計 前端2017 was a bumpy yet exciting year for me. I left my graphic designer job in March, and entered the maze of the coding world. Five months later, I finally got a job as a front-end developer at Tenten.co.2017年對我來說是坎a而又令人興奮的一年。 …

logstash5.x改變

5.x版本 logstash中 elasticsearch插件的workers&#xff0c;無法配置大于1&#xff0c;會提示 This plugin uses the shared and doesnt need this option 這個的意思是進到logstash本身的配置文件pipeline.output.workers。 不要一開始就修改workers個數。這也許是一個誤區。…

Suricata的初始化腳本

見官網 https://suricata.readthedocs.io/en/latest/initscripts.html

jpa在自己創建表的是字段名不一致_用 數據透視表 完成 Excel多表合并

一般情況下&#xff0c;數據透視表只能匯總一個表格中的數據。即使使用多區域匯總&#xff0c;也只能對多表的單列內容進行數據匯總&#xff0c;而多列卻無法實現。前段時間也推送過Power Query的方法&#xff0c;但它有版本限制。而今天宏興會計培訓小編推送的是一個通用的多表…

python根據數據生成圖像_從三個numpy數組生成圖像數據

首先&#xff0c;您應該運行以下代碼&#xff1a;import numpy as npX np.asarray()Y np.asarray()Z np.asarray()Xu np.unique(X)Yu np.unique(Y)然后您可以應用以下任何一種方法。值得注意的是&#xff0c;即使數據沒有被分類(與目前接受的答案相反)&#xff0c;所有這些…

leetcode120. 三角形最小路徑和(動態規劃)

**給定一個三角形&#xff0c;找出自頂向下的最小路徑和。**每一步只能移動到下一行中相鄰的結點上。 相鄰的結點 在這里指的是 下標 與 上一層結點下標 相同或者等于 上一層結點下標 1 的兩個結點。 例如&#xff0c;給定三角形&#xff1a; [ [2], [3,4], [6,5,7], [4,1,…

Bootstrap教程:學習構建第一個Bootstrap 4網站

快速教程&#xff0c;可幫助您快速掌握最新版本的Bootstrap。 (A quick tutorial to get you up to speed with the latest version of Bootstrap.) In my opinion, the best way to learn a new technology is often to start building stuff from day one. This gives a sens…

使用棧實現隊列 Implement Queue using Stacks

為什么80%的碼農都做不了架構師&#xff1f;>>> 問題&#xff1a; Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue.pop() -- Removes the element from in front of queue.peek() -- Get the front…