javascript --- js中的作用域 變量提升

1 求以下函數的輸出

1.1 考察點: 變量提升、this、作用域

// 考察點 作用域、this、變量提升
var a = 10
function test() {a = 100console.log(a)  console.log(this.a) var aconsole.log(a) 
}
test()
  • 第一個和第三個肯定是100
  • 在node環境下,沒有window的概念,因此輸出的是 undefined. (最后答案 100 undefined100)
  • 在瀏覽器環境下,在沒用找到this時,會順著作用域鏈找到window,而 window.a =10,因此會輸出 10. (最后答案 100 10 100)

[稍微改進]

var a = 10;
function test(){console.log(a);a = 100;console.log(this.a);var a;console.log(a)
}
test();
  • 此時根據與解析,會有如下:
var a = 10;
function test() {// var a;console.log(a);a = 100;console.log(this.a);var a;console.log(a)
}
test();
  • 瀏覽器環境下因此答案為: undefined 10 100

1.2 考察點: 閉包的作用域

(function(){var a = b = 3;
})()
console.log(b);	// 3
console.log(a);	// a is not defined
  • 說明: 在非嚴格模式下面,出現了var a = b = 3,實際上是b=3var a = b
  • 在執行b=3時,JS解釋器會自動在當前的全局環境下面掛在一個b屬性,值為3
  • 所以會輸出b=3a is not defined

1.3 考察點: 事件循環、單線程異步

for(var i=1 ; i<=3; i++){setTimeout(function(){console.log(i)}, 0)
}
  • 答案: 4 4 4
  • JS是單線程異步,當遇到異步函數的時候,會將異步函數添加到異步函數隊列中.
  • for是同步任務,因此,優先執行了3次循環,然后再執行3次輸出.此時,由于i的值是4 ,故輸出 3個4

[變形]:

for(let i = 1; i<=3; i++){setTimout(function(){console.log(i);}, 0);
}
  • 答案: 1 2 3
  • 前面和上面一樣的,但執行到輸出i的時候, 由于let 創建的變量是塊級作用域.
  • 可以看作是把i 同異步函數一起放在一個塊中,放入異步函數的隊列中.
  • 當時間到了從異步隊列中拿出塊來執行

1.4 考察點: 作用域 變量提升 形參實參

function fun(n){console.log(n);var n = 456;console.log(n);
}
var n = 123;
fun(n);
  • 根據與解析,函數實際如下
function fun(n){// var n = n;console.log(n);n = 456;console.log(n);
}
var n = 123;
fun(n);
  • 答案為: 123 456

[稍微改進一下]

function fun(){console.log(n);var n = 456;console.log(n);
}
var n = 123;
fun(n);
  • 答案是: undefined 456

[再稍微改進一下]

function fun(){console.log(n);n = 456;console.log(n);
}
var n = 123;
fun(n);
  • 此時沒用變量提升,答案是 123 456

[再再稍微改進一下]

function fun(){console.log(fun);fun = 456;console.log(fun);
}
fun();
var fun = 123;
  • 考察函數的提升和變量的提升,等價于,變量提升的速度快于函數提升
var fun = undefined;
var fun = function (){console.log(fun);fun = 456;console.log(fun);
}
fun();
fun = 123;
  • 由于函數的提升比變量的提升慢,因此,在遇到fun()時,會先執行console.log(fun),
  • 此時會輸出fun函數
  • 然后fun賦值為456,然后的console.log會輸出456
  • 故輸出結果為:[Function fun] 456

[再再再稍微改進一下]

function fun(){console.log(fun);fun = 456;console.log(fun);
}
var fun = 123;
fun();
  • 根據 變量提升,改造如下:
var fun = undefined;
var fun = function(){...};
fun = 123;
fun();
  • 執行到fun()時,由于fun是一個變量,因此會報錯: fun is not a function

[再再再再稍微改進一下]

var fun = 123;
function fun(){console.log(fun);fun = 456;console.log(fun);
}
fun();
  • 變量提升改造如下:
var fun = undefined;
var fun = function(){...}
fun = 123
fun();             
  • 執行到fun()時,由于fun是一個變量,因此會報錯: fun is not a function

2. 總結

  • 使用var的時候要特別小心,它有一個變量提升…
  • 函數也存在變量提升,但是它比變量的提升慢

參考

源代碼


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

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

相關文章

洛谷1091合唱隊形

題目描述 N位同學站成一排&#xff0c;音樂老師要請其中的(N?K)位同學出列&#xff0c;使得剩下的K位同學排成合唱隊形。 合唱隊形是指這樣的一種隊形&#xff1a;設K位同學從左到右依次編號為1,2,…,K&#xff0c;他們的身高分別為T1?,T2?,…,TK?&#xff0c; 則他們的身高…

poj3069 Saruman's Army(貪心)

https://vjudge.net/problem/POJ-3069 弄清楚一點&#xff0c;第一個stone的位置&#xff0c;考慮左右兩邊都要覆蓋R&#xff0c;所以一般情況下不會在左邊第一個&#xff08;除非前兩個相距>R&#xff09;。 一開始二層循環外層寫的i1&#xff0c;這樣對于數據諸如1 1 1>…

Redis的key和value大小限制

Redis的key和value大小限制今天研究了下將java bean序列化到redis中存儲起來&#xff0c;突然腦袋靈光一閃&#xff0c;對象大小會不會超過redis限制&#xff1f;不管怎么著&#xff0c;還是搞清楚一下比較好&#xff0c;所以就去問了下百度&#xff0c;果然沒多少人關心這個問…

jquery --- 監聽tab欄的變化

1. jQuery樣式操作 1.1 操作css方法 參數只寫屬性名,則返回屬性值(字符串) $(this).css(color)參數是 屬性名、屬性值(逗號分隔&#xff0c;則表示設置屬性 $(this).css(color,red)參數可以是對象的形式 $(this).css({width: 400px,height: 400px })1.2 設置類樣式方法 添…

bzoj 1645: [Usaco2007 Open]City Horizon 城市地平線【線段樹+hash】

bzoj題面什么鬼啊…… 題目大意&#xff1a;有一個初始值均為0的數列&#xff0c;n次操作&#xff0c;每次將數列(ai,bi-1)這個區間中的數與ci取max&#xff0c;問n次后元素和 離散化&#xff0c;然后建立線段樹&#xff0c;每次修改在區間上打max標記即可 #include<iostrea…

Redis單機和集群環境搭建

一、安裝單機版redis 1、可以自己去官網下載&#xff0c;當然也可以用課程提供的壓縮包 # yum install gcc # wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz # tar -xzvf tcl8.6.1-src.tar.gz # cd /usr/local/tcl8.6.1/unix/ # ./configure # make &…

yum離線安裝

安裝yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly下載對應的軟件包&#xff0c;我們以mysql為例&#xff0c;終端輸入如下命令 yum install -y --downloadonly --downloaddir/soft/mysql mysql --downloaddir用來指定下載的路徑轉載于:https://www.cnb…

算法 --- 遞歸實現多級樹展開結構

說明 先根據數據渲染,然后再實現事件 渲染 在項目中,經常會給出一個深度不確定的數組,數字結構如下: data [{name: a, child:[{name: a1},{name: a2, child: [{name:a21}]}]},{name: b} ]要求將數組渲染成對應的目錄結構, 結構如下: <ul><li>a<ul><…

PYTHON自動化Day4-交換變量,字符串方法,拷貝,集合,文件,文件指針

一.判斷 # 非空即真、非0即真 # 不為空的話就是true&#xff0c;是空的話就是false # 只要不是0就是true&#xff0c;是0就是false# 布爾類型 # True False name input(請輸入你的名字&#xff1a;).strip() a [] #false d{} # false c 0 #false f tuple() #false e #fa…

Ajax-jsonp

一、什么是Jsonp jsonp(json with padding) 是一種“使用模式”&#xff0c;可以讓網頁從別的域名那獲取資料&#xff0c;即跨域讀取數據。 為什么會使用jsonp呢&#xff1f;因為同源策略&#xff08;數據來源一致&#xff09;&#xff0c;現在所有支持javascript 的瀏覽器都會…

javascript --- [讀書筆記] 回流與重繪 前端優化小結

1. 瀏覽器渲染原理 請說出: 從用戶在瀏覽器地址輸入網址,到看整個頁面,中間都發生了哪些事情? HTTP請求階段HTTP響應階段瀏覽器渲染階段 1.1 可能用到的知識 1.1.1 進程 Process、線程 Thread、 棧內存 Stack 進程: 就是開的每一個程序: QQ、網易云音樂、Typora、VSCode……

ARP協議,以及ARP欺騙

1.定義&#xff1a; 地址解析協議&#xff0c;即ARP&#xff08;Address Resolution Protocol&#xff09;&#xff0c;是根據IP地址獲取物理地址的一個TCP/IP協議。主機發送信息時將包含目標IP地址的ARP請求廣播到網絡上的所有主機&#xff0c;并接收返回消息&#xff0c;以此…

css --- [小結]讓盒子水平垂直居中的解決方案

描述 有如下模型,想辦法讓 <style>.box{width: 500px;height: 500px;background: skyblue;} </style> <div class"box"><div class"inner"></div> </div>想辦法讓inner在box中水平垂直居中 方案1: 使用絕對定位 讓…

數組洗牌 Fisher Yates

看播放器代碼時發現的這個洗牌算法&#xff0c;再網上查了一番 作用是把數組變成隨機序列&#xff0c;原理類似于從牌堆A中隨機抽牌放進牌堆B 代碼1&#xff1a; 返回一個由&#xff08;數組下標&#xff09;組成的數組 function random(length) {function shuffle (arr) {for…

一個不錯的MYSQL數據庫備份類,PHP版,一個文件,精簡版

1 <?php2 class DbManage {3 var $db; // 數據庫連接4 var $database; // 所用數據庫5 var $sqldir; // 數據庫備份文件夾6 // 換行符7 private $ds "\n";8 // 存儲SQL的變量9 public $sqlContent "";10 // 每條sql…

javascript --- 堆棧內存與閉包的作用

你可能會用到的 堆內存: 存儲引用類型值所在的空間棧內存: 存儲基本類型值和存儲代碼所在空間函數上下文: JS每一個函數在執行的時候都會創建一個執行上下文 1. 堆內存中的數字和字符串都是相等的 let a {}, b0, c0; a[b] marron; a[c] Mar console.log(a[b]) // Mar第一…

python_sting字符串的方法及注釋

string類型是python內置的類型&#xff0c;無需安裝 方法/屬性說明 capitalize() 把字符串的第一個字符改為大寫 casefold() 把整個字符串的所有字符改為小寫 center(width) 將字符串居中&#xff0c;并使用空格填充至長度width的新字符串 count(sub[,start[,end]]) …

作業3

import turtle turtle.bgcolor(red) turtle.color(yellow)turtle.fillcolor(yellow) turtle.begin_fill() for i in range(5):turtle.forward(100)turtle.right(144) turtle.end_fill() turtle.done()轉載于:https://www.cnblogs.com/zhangkef97/p/9016608.html

javascript --- [小練習]變量提升、優先級綜合

求下列函數輸出結果 function Foo() {getName function() {console.log(1)}return this } Foo.getName function() {console.log(2) } Foo.prototype.getName function() {console.log(3) } var getName function() {console.log(4) }function getName() {console.log(5) …

Confluence 6 自定義 Decorator 模板的宏和針對高級用戶

宏 頁面的某些部分使用的是 Velocity 宏進行創建的&#xff0c;包括導航欄。有關宏的創建&#xff0c;你可以參考頁面 Working With Decorator Macros 頁面中的內容。 針對高級用戶 velocity 目錄是 Confluence 首先進行模板搜索的查找路徑。你可以對 Confluence 的 velocity …