摘要:即的變量提升此處變量未聲明時便可以使用,其實是因為會自動將聲明語句提升到頂部。但名字的初始化卻是按其在代碼中書寫的順序進行的,不受以上優(yōu)先級的影響。
變量提升(hoisting)
在JavaScript中,函數(shù)、變量的聲明都會被提升(hoisting)到該函數(shù)或變量所在的scope的頂部。即——JavaScript的變量提升.
var x = 5; alert(x); // 5 alert(y); // undefined var y = 7; alert(y); // 7
此處變量y未聲明時便可以使用,其實是因為JavaScript會自動將聲明語句提升到頂部。
而第一次alert(y)時顯示undefined,說明只提升了聲明,未提升賦值語句。等同于以下:
var y; alert(y); // undefined y = 7; alert(y); // 7
javascript中一個名字(name)以四種方式進入作用域(scope),其優(yōu)先級順序如下:
語言內置:所有的作用域中都有 this 和 arguments 關鍵字;
形式參數(shù):函數(shù)的參數(shù)在函數(shù)作用域中都是有效的;
函數(shù)聲明:形如function foo() {};
變量聲明:形如var bar;
名字聲明的優(yōu)先級如上所示。也就是說如果一個變量的名字與函數(shù)的名字相同,那么函數(shù)的名字會覆蓋變量的名字,無論其在代碼中的順序如何。但名字的初始化卻是按其在代碼中書寫的順序進行的,不受以上優(yōu)先級的影響。看代碼:
(function(){ var foo; console.log(typeof foo); //function function foo(){} foo = "foo"; console.log(typeof foo); //string var foo; })();
function test() { foo(); // TypeError "foo is not a function" bar(); // "this will run!" var foo = function () { // function expression assigned to local variable "foo" alert("this won"t run!"); } function bar() { // function declaration, given the name "bar" alert("this will run!"); } } test();
函數(shù)表達式的聲明:
foo(); // TypeError "foo is not a function" bar(); // valid baz(); // TypeError "baz is not a function" spam(); // ReferenceError "spam is not defined" var foo = function () {}; // anonymous function expression ("foo" gets hoisted) function bar() {}; // function declaration ("bar" and the function body get hoisted) var baz = function spam() {}; // named function expression (only "baz" gets hoisted) foo(); // valid bar(); // valid baz(); // valid spam(); // ReferenceError "spam is not defined"JavaScript中的作用域
JavaScript中運行以下代碼我們會發(fā)現(xiàn),i為10?
for (var i = 0; i < 10; i++) { // some code } return i; //10
在如Java、C、C++等其他語言中,作用域一般為for語句、if語句或{}內的一塊區(qū)域,稱為塊級區(qū)域(block-level scope);
而在JavaScript中,作用域則是函數(shù)域(function-level scope).
var x = 1; console.log(x); // 1 if (true) { var x = 2; console.log(x); // 2 } console.log(x); // 2 function foo() { var x = 1; if (x) { (function () { var x = 2; // some other code }()); } console.log(x); // x is still 1. } var foo = 1; function bar() { if (!foo) { // 由于var foo被提升,此處foo為undefined,進入if var foo = 10; } alert(foo); // 10 } bar();
var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); // 1
引用自:JavaScript Scoping and Hoisting--written by ben cherry
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79759.html
摘要:不同的是函數(shù)體并不會再被提升至函數(shù)作用域頭部,而僅會被提升到塊級作用域頭部避免全局變量在計算機編程中,全局變量指的是在所有作用域中都能訪問的變量。 ES6 變量作用域與提升:變量的生命周期詳解從屬于筆者的現(xiàn)代 JavaScript 開發(fā):語法基礎與實踐技巧系列文章。本文詳細討論了 JavaScript 中作用域、執(zhí)行上下文、不同作用域下變量提升與函數(shù)提升的表現(xiàn)、頂層對象以及如何避免創(chuàng)建...
摘要:作用域的類別可以影響到變量的取值,分為詞法作用域靜態(tài)作用域和動態(tài)作用域。而,采用的就是詞法作用域,或者叫靜態(tài)作用域。 關于javascript中的作用域和作用域鏈 我GitHub上的菜鳥倉庫地址: 點擊跳轉查看其他相關文章 文章在我的博客上的地址: 點擊跳轉 ? ? ? ? 前面的文章說到, 執(zhí)行上下文的創(chuàng)建階段,主要有三個內容: ? ? ? ? 1、創(chuàng)建變量對象;2、初始化作用域...
摘要:作用域是代碼的不同部分在運行期間的可見性。大多數(shù)開發(fā)者想當然地理解作用域,但毫無疑問,有它自己的說明。變量可能是全局作用域的,或者是方法作用域的。總而言之,不要重復聲明變量,使用良好命名,盡力避免在聲明前調用和執(zhí)行任何東西。 原文鏈接:https://hackernoon.com/unders... 什么是作用域? 就像JavaScript中的其他東西一樣,作用域并無特別之處。盡管大多...
摘要:在的閉包中,閉包函數(shù)能夠訪問到包庇函數(shù)中的變量,這些閉包函數(shù)能夠訪問到的變量也因此被稱為自由變量。在之前最常見的兩種作用域,全局作用局和函數(shù)作用域局部作用域。 關于文章討論請訪問:https://github.com/Jocs/jocs.... 當Brendan Eich在1995年設計JavaScript第一個版本的時候,考慮的不是很周到,以至于最初版本的JavaScript有很多不...
閱讀 1541·2023-04-25 18:56
閱讀 1493·2021-09-29 09:34
閱讀 1715·2021-09-22 15:51
閱讀 3496·2021-09-14 18:03
閱讀 1167·2021-07-23 17:54
閱讀 2024·2019-08-29 18:38
閱讀 2908·2019-08-29 12:38
閱讀 615·2019-08-26 13:41