首頁 web前端 js教程 JavaScript修改作用域外變數的方法_javascript技巧

JavaScript修改作用域外變數的方法_javascript技巧

May 16, 2016 pm 03:08 PM

1.今天在看JavaScript學習指南的時候做的課後習題,也因此詳細的對函數的傳入參數進行比較深入的研究.

題目如下:

  函數如何才能修改其作用域之外的變數?寫一個函數,由1~5的數字組成的陣列作為參數,調用該函數後將把其中的數字項替換為對應的字串表示形式.

要注意知識點:

  在JavaScript中函數參數的傳遞,對於基於原始值的參數進行值傳遞(數字,字符串,布爾值),函數中的修改不會影響實際參數值.而傳遞給函數的參數而言,物件是一個引用,對其的修改的將會反映在主調程式中.

var outer_number = ;
var outer_boolean = true;
var outer_array = [,,];
var outer_object = {test:""};
function display(num,bool,arr,obj){
console.log("number:"+num+"\nboolean:"+bool+"\narray:"+arr+"\nobject:"+obj.test);
}
function test(num,bool,arr,obj){
display(num,bool,arr,obj);//num=,bool=true,array=[,,],object.test=
num = ;
bool = false;
arr[] = ;
obj.test = "";
display(num,bool,arr,obj);//num=,bool=false,array=[,,,],object.test=
arr = [,,];
obj = {test:""};
display(num,bool,arr,obj);//num=,bool=false,array=[,,],object.test=
}
test(outer_number,outer_boolean,outer_array,outer_object);
display(outer_number,outer_boolean,outer_array,outer_object);//num = ,bool=true,array=[,,,],object.test= 
登入後複製

在上面程式碼中我們建立了4個全域變數,型別分別為數字,布林值,陣列,物件.2個函數,display和test.

display執行了4次,分別結果如下:

"number:2
boolean:true
array:1,2,3
object:122"<-傳入函數時的值

"number:0
boolean:false
array:1,2,3,3
object:134"<-執行更改

"number:0
boolean:false
array:3,2,1
object:133"<-重新賦值

"number:2
boolean:true
array:1,2,3,3
object:134"<-函數執行完畢後

可以看出我們對數組和對象的重新賦值並沒有成功,如果按引用傳遞,那麼我們應該也對全局變量的數組和對象重新賦值修改了呀.
其實JavaScript中所謂的按引用賦值並不是真正意義上的按引用複製,準確地說應該是按共享傳遞.也可以叫按對象傳遞,按對象共享傳遞(call by sharing).

在這個按共享傳遞的條件下,我們獲取的引用可以說只是實參引用的副本,它和我們經常說的按引用傳遞的最大差別就在於我們在對引用副本的賦值不會影響實參的值,正如我們上面那樣做的那樣,賦值操作是不可行的.

當然我們從物件類型和基本型別兩方面看,物件是可變的而基本型別是不可變的(注意!字串修改其實是傳回的新的字串),所以按共用傳遞對於基本型別是基本型別對於基本型別類型來說也是符合共享傳遞的.

總結一下:

  JavaScript中,基本類型和物件都按共享傳遞(call by sharing),但是由於JavaScript的基本類型的不變性,基本類型按共享傳遞與按值傳遞沒有任何區別,而對象按共享傳遞.

按共享傳遞(call by sharing):傳遞的是實參引用的副本,我們對引用副本的賦值不影響實參的值,但是可以使用引用副本去修改引用的內容.詳細的wiki地址

函數對傳入的參數:

1.基本型別,按值傳遞(或也可以說依共享傳遞),內部賦值修改都不影響主調程式

2.物件類型,依共享傳遞,傳入的為實參引用的副本,內部對該引用的賦值無效,對物件屬性的賦值修改有效.

大概就是這麼理解了,假如有什麼地方我犯了什麼錯誤,也希望能被指出來.

下面單獨拉出JavaScript作用域

  任何程式設計語言都有作用域的概念,簡單的說,作用域就是變數與函數的可存取範圍,即作用域控制變數與函數的可見度和生命週期。在JavaScript中,變數的作用域有全域作用域和局部作用域兩種。

   全域作用域(Global Scope)

  在程式碼中任何地方都能存取到的物件擁有全域作用域,一般來說以下幾種情形擁有全域作用域:

  (1)最外層函數和在最外層函數外定義的變數擁有全域作用域,例如:

var authorName="山边小溪";
function doSomething(){
var blogName="梦想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(authorName); //山边小溪
alert(blogName); //脚本错误
doSomething(); //梦想天空
innerSay() //脚本错误
登入後複製

  (2)所有末定義直接賦值的變數自動宣告為擁有全域作用域,例如:

function doSomething(){
var authorName="山边小溪";
blogName="梦想天空";
alert(authorName);
}
doSomething(); //山边小溪
alert(blogName); //梦想天空
alert(authorName); //脚本错误 
登入後複製

  变量blogName拥有全局作用域,而authorName在函数外部无法访问到。

  (3)所有window对象的属性拥有全局作用域

  一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

  1. 局部作用域(Local Scope)  

  和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。

function doSomething(){
var blogName="梦想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(blogName); //脚本错误
innerSay(); //脚本错误 
登入後複製

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

前端熱敏紙小票打印遇到亂碼問題怎麼辦? 前端熱敏紙小票打印遇到亂碼問題怎麼辦? Apr 04, 2025 pm 02:42 PM

前端熱敏紙小票打印的常見問題與解決方案在前端開發中,小票打印是一個常見的需求。然而,很多開發者在實...

神秘的JavaScript:它的作用以及為什麼重要 神秘的JavaScript:它的作用以及為什麼重要 Apr 09, 2025 am 12:07 AM

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

誰得到更多的Python或JavaScript? 誰得到更多的Python或JavaScript? Apr 04, 2025 am 12:09 AM

Python和JavaScript開發者的薪資沒有絕對的高低,具體取決於技能和行業需求。 1.Python在數據科學和機器學習領域可能薪資更高。 2.JavaScript在前端和全棧開發中需求大,薪資也可觀。 3.影響因素包括經驗、地理位置、公司規模和特定技能。

如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? 如何使用JavaScript將具有相同ID的數組元素合併到一個對像中? Apr 04, 2025 pm 05:09 PM

如何在JavaScript中將具有相同ID的數組元素合併到一個對像中?在處理數據時,我們常常會遇到需要將具有相同ID�...

JavaScript難以學習嗎? JavaScript難以學習嗎? Apr 03, 2025 am 12:20 AM

學習JavaScript不難,但有挑戰。 1)理解基礎概念如變量、數據類型、函數等。 2)掌握異步編程,通過事件循環實現。 3)使用DOM操作和Promise處理異步請求。 4)避免常見錯誤,使用調試技巧。 5)優化性能,遵循最佳實踐。

如何實現視差滾動和元素動畫效果,像資生堂官網那樣?
或者:
怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? 如何實現視差滾動和元素動畫效果,像資生堂官網那樣? 或者: 怎樣才能像資生堂官網一樣,實現頁面滾動伴隨的動畫效果? Apr 04, 2025 pm 05:36 PM

實現視差滾動和元素動畫效果的探討本文將探討如何實現類似資生堂官網(https://www.shiseido.co.jp/sb/wonderland/)中�...

JavaScript的演變:當前的趨勢和未來前景 JavaScript的演變:當前的趨勢和未來前景 Apr 10, 2025 am 09:33 AM

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

console.log輸出結果差異:兩次調用為何不同? console.log輸出結果差異:兩次調用為何不同? Apr 04, 2025 pm 05:12 PM

深入探討console.log輸出差異的根源本文將分析一段代碼中console.log函數輸出結果的差異,並解釋其背後的原因。 �...

See all articles