作用域JavaScript 的变量作用域是按照函数划分的,为了快速的了解它的特性,我们通过实例来进行演示。
实例一:
<script type="text/javascript"> var i = 1; // 弹出内容为 1 true 的提示框 alert(window.i + ' ' + (window.i == i)); </script>
分析:
在全局定义的变量其实就是 window 对象的属性。
上面的例子可以看到,我们定义全局变量的同时,window 对象会产生一个相应的属性,如何让我们的代码避免产生这个属性呢,看下面的例子。
实例二:
<script type="text/javascript"> var document = 1; window.onload = function(){ alert(document); } // 弹出内容为 1 的提示框 alert(window.document); </script>
这种情况是我们不想看到的,我们可以这么做:
<script type="text/javascript"> function test(){ var document = 1; window.onload = function(){ alert(document); } } test(); // 弹出内容为 [object] 的提示框 alert(window.document); </script>
为了使代码更加简洁,我们可以这样:
<script type="text/javascript"> (function(){ var document = 1; window.onload = function(){ alert(document); } })(); // 弹出内容为 [object] 的提示框 alert(window.document); </script>
分析:
这种运行匿名方法的形式,在 JavaScript 的主流框架中经常见到,这样做可以避免产生不必要的 window 对象的属性,减少冲突的可能。
实例三:
<script type="text/javascript"> (function(){ if('1' == '1'){ var i = 1; } // 弹出内容为 1 的提示框 alert(i); })(); </script>
分析:
变量的作用域是整个函数,不是{}块。
实例四:
<script type="text/javascript"> var i = 1; // 弹出内容为 1 的提示框 alert(i); var i = 2; // 弹出内容为 2 的提示框 alert(i); </script>
分析:
一个变量可以被重新定义,这个看起来有些怪,因为在很多其他语言里这样是行不通的。
实例五:
<script type="text/javascript"> function test(){ i = 1; } test(); // 弹出内容为 1 的提示框 alert(window.i); </script>
分析:
如果对一个没有初始化的变量进行赋值操作,那么这个变量会作为全局变量。
实例六:
<script type="text/javascript"> window.onload = function(){ var i = 1; function test(){ alert(i); } // 弹出内容为 1 的提示框 test(); } </script>
分析:
内部函数可以访问外部函数的变量,这个就引出了一个新的概念,那就是闭包。
闭包
什么是闭包呢,简单的说就是一个函数 A ,它的内部函数 B 可以访问 A 内定义的变量,即使函数 A 已经终止。下面通过实例进行了解。
实例七:
<script type="text/javascript"> window.onload = function(){ var i = 1; window.onunload = function(){ alert(i); } } </script>
分析:
当整个页面加载完成时,会触发 onload 事件,这个onload 事件方法里给窗口的onunload 事件注册了一个方法,这个方法里用到了onload 事件方法里声明的变量,然后onload 事件方法运行结束,这时候我们点击关闭窗口,会弹出内容为1的提示框,说明onunload 的事件方法成功的调用了onload 事件方法里声明的变量。
为了进一步了解闭包的特性,看下面的例子
实例八:
<script type="text/javascript"> function initX(oarg){ // 定义一个变量 var x = oarg; // 定义一个显示变量的方法 var funGet = function(){ alert(x); } // 定义一个对变量进行修改的方法 var funSet = function(iarg){ x = iarg; } // 返回这两个方法 return [funGet,funSet]; } // 运行一个方法实例,返回值为包含 get 和 set 方法的数组 var funArr = initX(1); // 得到 get 方法 var funGet = funArr[0]; // 得到 set 方法 var funSet = funArr[1]; // 运行 get 方法,显示initX方法实例内的 x 变量,结果为 1 funGet(); // 运行 set 方法,对initX方法实例内的 x 变量进行赋值 funSet(2); // 运行 get 方法,显示initX方法实例内的 x 变量,结果为 2 funGet(); </script>
分析:
当内部函数对外部函数定义的变量进行调用时,实际上引用的是这个变量的内存块,所以当我们调用内部函数时,引用的变量值是当前这个变量的实际内容。
闭包功能虽然强大,但是如果不注意,它也会给我们带来困扰。看下面的例子。
实例九:
<button id="main">run</button> <script type="text/javascript"> (function(){ var obj = document.getElementById("main"); var funArr = ['onclick','onkeypress']; for(var i=0; i<funArr.length; i++){ var temp = funArr[i]; obj[temp] = function(){ alert(temp); } } })(); </script>
写代码的原意是给 id 是 main 的按钮注册点击事件和按键事件,事件的内容是分别弹出事件名称的提示框。但是结果有点匪夷所思,两个事件的提示框全是 onkeypress,根据闭包的原理,我们仔细分析,就会发现当两个事件方法被调用时 temp 变量 指向的是 funArr[1] 的内容,我们可以这样修改来解决这个问题:
<button id="main">run</button> <script type="text/javascript"> (function(){ var obj = document.getElementById("main"); var funArr = ['onclick','onkeypress']; for(var i=0; i<funArr.length; i++){ (function(){ var temp = funArr[i]; obj[temp] = function(){ alert(temp); } })(); } })(); </script>
把 for 循环内的代码放入一个函数内,这样,每循环一次都会产生一个函数实例,让函数实例记录 funArr 数组中的每个值,这样就避免了上面碰到的问题。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

JavaScript在網站、移動應用、桌面應用和服務器端編程中均有廣泛應用。 1)在網站開發中,JavaScript與HTML、CSS一起操作DOM,實現動態效果,並支持如jQuery、React等框架。 2)通過ReactNative和Ionic,JavaScript用於開發跨平台移動應用。 3)Electron框架使JavaScript能構建桌面應用。 4)Node.js讓JavaScript在服務器端運行,支持高並發請求。

Python更適合數據科學和自動化,JavaScript更適合前端和全棧開發。 1.Python在數據科學和機器學習中表現出色,使用NumPy、Pandas等庫進行數據處理和建模。 2.Python在自動化和腳本編寫方面簡潔高效。 3.JavaScript在前端開發中不可或缺,用於構建動態網頁和單頁面應用。 4.JavaScript通過Node.js在後端開發中發揮作用,支持全棧開發。

C和C 在JavaScript引擎中扮演了至关重要的角色,主要用于实现解释器和JIT编译器。1)C 用于解析JavaScript源码并生成抽象语法树。2)C 负责生成和执行字节码。3)C 实现JIT编译器,在运行时优化和编译热点代码,显著提高JavaScript的执行效率。

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)