电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

簡單了解JavaScript作用域

瀏覽:113日期:2023-10-19 09:10:35

作用域通常是指在指定的時間內,變量存在于一段代碼中。缺乏對作用域的理解可能會導致令人沮喪的調試體驗。作用域的概念是關于我們的代碼中可以訪問到哪些確定的函數或變量,代碼的上下文和執行環境。

在 JavaScript 中,有兩種類型的作用域:全局和局部作用域。

全局作用域

第一種作用域是全局作用域。它很容易定義。如果一個變量或函數是_全局的_,那么在程序中的任何地方都可以訪問到它們。在瀏覽器中,全局作用域是 window對象。如果在函數外面聲明一個變量,那么這個變量就存在全局對象中。例如:

var x = 9;

一旦該變量被定義,則可以被引用為 window.x,因為它存在于全局對象中,我們可以簡單的引用它為 x。

局部作用域

JavaScript 也可以在每個函數體中創建局部作用域。例如:

function myFunc() { var x = 5;}myFunc();console.log( x ); // ReferenceError: x is not defined

由于 x 是在 myFunc() 中初始化,所以它只能在 myFunc() 中被訪問,如果我們試圖在 myFunc() 外面訪問 x,則會得到一個引用錯誤。

注意

如果你忘記使用 var 關鍵字聲明變量,那么這個變量會自動變成全局變量。所以這段代碼可以運行:

function myFunc() { x = 5;}myFunc();console.log( x ); // 5

這是一個壞主意。全局變量的值可以被程序的任何部分或者其他腳本更改。這是不期望發生的,因為它會導致無法預料的副作用。

立即調用表達式(IIFE)提供了一個避免全局變量的方式。你會看到許多如 jQuery 的 JavaScript 庫經常使用這種方式:

(function() { var jQuery = { /* All my methods go here. */ }; window.jQuery = jQuery;})();

將一切包含在一個函數中并立即調用這個函數,這意味著函數中的所有變量都被綁定在_局部作用域_中。在函數結尾部分,你可以通過將 jQuery 對象綁定在全局對象 window 上,將一些方法和屬性公開出來。了解更多關于立即調用函數表達式,請查看 Ben Alman 的文章 Immediately-Invoked Function Expression。

因為局部作用域通過函數而工作,任何在另一個函數中定義的函數都可以訪問外部函數里的變量:

function outer() { var x = 5; function inner() { console.log( x ); } inner(); // 5}

但是 .outer() 函數不能訪問 .inner() 函數中定義的任何變量。

function outer() { var x = 5; function inner() { console.log( x ); var y = 10; } inner(); // 5 console.log( y ); // ReferenceError: y is not defined}

另外,在一個函數中沒有使用 var 關鍵字定義的變量不是這個函數的局部變量 - JavaScript 會向上遍歷作用域鏈(最后會到 window 對象)尋找之前定義的這個變量。如果這個變量沒有定義,則會在全局中定義該變量,這樣會導致意外的結果。

// Functions have access to variables defined in the same scope.var foo = 'hello';var sayHello = function() { console.log( foo );};sayHello(); // 'hello'console.log( foo ); // 'hello'

相同名稱的變量可以在不同作用域中保存不同的值:

var foo = 'world';var sayHello = function() { var foo = 'hello'; console.log( foo );};sayHello(); // 'hello'console.log( foo ); // 'world'

當在一個函數中引用一個外部作用域定義的變量,函數可以訪問在該函數定義之后發生改變的變量值。

var myFunction = function() { var foo = 'hello'; var myFn = function() { console.log( foo ); }; foo = 'world'; return myFn;};var f = myFunction();f(); // 'world'

這是一個更復雜的作用域例子:

(function() { var baz = 1; var bim = function() { console.log( baz ); }; bar = function() { console.log( baz ); };})();

在這個實例中,運行:

console.log( baz ); // baz is not defined outside of the function

將會得到一個 ReferenceError。baz 僅僅是在函數中定義,并且沒有暴露在全局作用域中。

bar(); // 1

.bar() 是在匿名函數中定義的, 但是它沒有使用 var 關鍵字定義,這意味著它沒有綁定到局部作用域,而是在全局作用域創建。另外,它可以訪問 baz 變量,因為 .bar() 是在與 baz 相同的作用域定義的,所以它可以訪問變量 baz,即使函數外部的其他代碼不可以。

bim(); // ReferenceError: bim is not defined

.bim() 只在函數中定義的,所以它作為局部變量而不存在于全局對象中。

以上就是簡單了解JavaScript作用域的詳細內容,更多關于JavaScript作用域的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 天然气分析仪-液化气二甲醚分析仪|传昊仪器| 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 宏源科技-房地产售楼系统|线上开盘系统|售楼管理系统|线上开盘软件 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 昆明网络公司|云南网络公司|昆明网站建设公司|昆明网页设计|云南网站制作|新媒体运营公司|APP开发|小程序研发|尽在昆明奥远科技有限公司 | 气动机械手-搬运机械手-气动助力机械手-山东精瑞自动化设备有限公司 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 广东青藤环境科技有限公司-水质检测 | 拉力机-拉力试验机-万能试验机-电子拉力机-拉伸试验机-剥离强度试验机-苏州皖仪实验仪器有限公司 | 安全,主动,被动,柔性,山体滑坡,sns,钢丝绳,边坡,防护网,护栏网,围栏,栏杆,栅栏,厂家 - 护栏网防护网生产厂家 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 石油/泥浆/不锈钢防腐/砂泵/抽砂泵/砂砾泵/吸砂泵/压滤机泵 - 专业石油环保专用泵厂家 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 一体化隔油提升设备-餐饮油水分离器-餐厨垃圾处理设备-隔油池-盐城金球环保产业发展有限公司 | 并网柜,汇流箱,电控设备,中高低压开关柜,电气电力成套设备,PLC控制设备订制厂家,江苏昌伟业新能源科技有限公司 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 尚为传动-专业高精密蜗轮蜗杆,双导程蜗轮蜗杆,蜗轮蜗杆减速机,蜗杆减速机生产厂家 | 加热制冷恒温循环器-加热制冷循环油浴-杭州庚雨仪器有限公司 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 冲锋衣滑雪服厂家-冲锋衣定制工厂-滑雪服加工厂-广东睿牛户外(S-GERT) | 【北京写字楼出租_写字楼租赁_办公室出租网/出售】-远行地产官网 | 航空障碍灯_高中低光强航空障碍灯_民航许可认证航空警示灯厂家-东莞市天翔航天科技有限公司 | 合肥卓创建筑装饰,专业办公室装饰、商业空间装修与设计。 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | BESWICK球阀,BESWICK接头,BURKERT膜片阀,美国SEL继电器-东莞市广联自动化科技有限公司 | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | 生物除臭剂-除味剂-植物-污水除臭剂厂家-携葵环保有限公司 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 液氮罐_液氮容器_自增压液氮罐-北京君方科仪科技发展有限公司 | 垃圾清运公司_环卫保洁公司_市政道路保洁公司-华富环境 | 消防泵-XBD单级卧式/立式消防泵-上海塑泉泵阀(集团)有限公司 | 防火卷帘门价格-聊城一维工贸特级防火卷帘门厂家▲ | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 电缆接头_防水接头_电缆防水接头 - 乐清市新豪电气有限公司 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 儿童乐园|游乐场|淘气堡招商加盟|室内儿童游乐园配套设备|生产厂家|开心哈乐儿童乐园 | 骨密度检测仪_骨密度分析仪_骨密度仪_动脉硬化检测仪专业生产厂家【品源医疗】 | 贝朗斯动力商城(BRCPOWER.COM) - 买叉车蓄电池上贝朗斯商城,价格更超值,品质有保障! | 专注氟塑料泵_衬氟泵_磁力泵_卧龙泵阀_化工泵专业品牌 - 梭川泵阀 |