欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript修改作用域外變量的方法

 更新時(shí)間:2016年03月25日 09:22:32   作者:thewindsword  
 作用域是JavaScript最重要的概念之一,想學(xué)好javascript需要深入理解javascript作用域原理,接下來(lái)通過(guò)本文給大家介紹javascript修改作用域外變量的方法,需要的朋友一起學(xué)習(xí)吧

1.今天在看JavaScript學(xué)習(xí)指南的時(shí)候做的課后習(xí)題,也因此詳細(xì)的對(duì)函數(shù)的傳入?yún)?shù)進(jìn)行比較深入的研究.

題目如下:

  函數(shù)如何才能修改其作用域之外的變量?編寫(xiě)一個(gè)函數(shù),由1~5的數(shù)字組成的數(shù)組作為參數(shù),調(diào)用該函數(shù)后將把其中的數(shù)字項(xiàng)替換為相應(yīng)的字符串表示形式.

需要注意知識(shí)點(diǎn):

  在JavaScript中函數(shù)參數(shù)的傳遞,對(duì)于基于原始值的參數(shù)進(jìn)行值傳遞(數(shù)字,字符串,布爾值),函數(shù)中的修改不會(huì)影響實(shí)際參數(shù)值.而傳遞給函數(shù)的參數(shù)而言,對(duì)象是一個(gè)引用,對(duì)其的修改的將會(huì)反映在主調(diào)程序中.<-但是,會(huì)有這樣的情況,如下

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= 

在上面代碼中我們創(chuàng)建了4個(gè)全局變量,類(lèi)型分別為數(shù)字,布爾值,數(shù)組,對(duì)象.2個(gè)函數(shù),display和test.

display執(zhí)行了4次,分別結(jié)果如下:

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

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

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

"number:2
boolean:true
array:1,2,3,3
object:134"<-函數(shù)執(zhí)行完畢后

可以看出我們對(duì)數(shù)組和對(duì)象的重新賦值并沒(méi)有成功,如果按引用傳遞,那么我們應(yīng)該也對(duì)全局變量的數(shù)組和對(duì)象重新賦值修改了呀.
其實(shí)JavaScript中所謂的按引用賦值并不是真正意義上的按引用復(fù)制,準(zhǔn)確說(shuō)應(yīng)該是按共享傳遞.也可以叫按對(duì)象傳遞,按對(duì)象共享傳遞(call by sharing).

在這個(gè)按共享傳遞的條件下,我們獲取的引用可以說(shuō)只是實(shí)參引用的副本,它和我們經(jīng)常說(shuō)的按引用傳遞的最大差別就在于我們?cè)趯?duì)引用副本的賦值不會(huì)影響實(shí)參的值,正如我們上面那樣做的那樣,賦值操作是不可行的.

當(dāng)然我們從對(duì)象類(lèi)型和基本類(lèi)型兩方面看,對(duì)象是可變的而基本類(lèi)型是不可變的(注意!字符串修改其實(shí)是返回的新的字符串),所以按共享傳遞對(duì)于基本類(lèi)型來(lái)說(shuō)也是符合按共享傳遞的.

總結(jié)一下:

  JavaScript中,基本類(lèi)型和對(duì)象都按共享傳遞(call by sharing),但是由于JavaScript的基本類(lèi)型的不變性,基本類(lèi)型按共享傳遞與按值傳遞沒(méi)有任何區(qū)別,而對(duì)象按共享傳遞.

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

函數(shù)對(duì)傳入的參數(shù):

1.基本類(lèi)型,按值傳遞(或者也可以說(shuō)按共享傳遞),內(nèi)部賦值修改都不影響主調(diào)程序

2.對(duì)象類(lèi)型,按共享傳遞,傳入的為實(shí)參引用的副本,內(nèi)部對(duì)該引用的賦值無(wú)效,對(duì)對(duì)象屬性的賦值修改有效.

大概就是這么理解了,假如有什么地方我犯了什么錯(cuò)誤,也希望能被指出來(lái).

下面單獨(dú)拉出JavaScript作用域

  任何程序設(shè)計(jì)語(yǔ)言都有作用域的概念,簡(jiǎn)單的說(shuō),作用域就是變量與函數(shù)的可訪(fǎng)問(wèn)范圍,即作用域控制著變量與函數(shù)的可見(jiàn)性和生命周期。在JavaScript中,變量的作用域有全局作用域和局部作用域兩種。

   全局作用域(Global Scope)

  在代碼中任何地方都能訪(fǎng)問(wèn)到的對(duì)象擁有全局作用域,一般來(lái)說(shuō)以下幾種情形擁有全局作用域:

 ?。?)最外層函數(shù)和在最外層函數(shù)外面定義的變量擁有全局作用域,例如:

var authorName="山邊小溪";
function doSomething(){
var blogName="夢(mèng)想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(authorName); //山邊小溪
alert(blogName); //腳本錯(cuò)誤
doSomething(); //夢(mèng)想天空
innerSay() //腳本錯(cuò)誤

  (2)所有末定義直接賦值的變量自動(dòng)聲明為擁有全局作用域,例如:

function doSomething(){
var authorName="山邊小溪";
blogName="夢(mèng)想天空";
alert(authorName);
}
doSomething(); //山邊小溪
alert(blogName); //夢(mèng)想天空
alert(authorName); //腳本錯(cuò)誤 

  變量blogName擁有全局作用域,而authorName在函數(shù)外部無(wú)法訪(fǎng)問(wèn)到。

  (3)所有window對(duì)象的屬性擁有全局作用域

  一般情況下,window對(duì)象的內(nèi)置屬性都擁有全局作用域,例如window.name、window.location、window.top等等。

  1. 局部作用域(Local Scope)  

  和全局作用域相反,局部作用域一般只在固定的代碼片段內(nèi)可訪(fǎng)問(wèn)到,最常見(jiàn)的例如函數(shù)內(nèi)部,所有在一些地方也會(huì)看到有人把這種作用域稱(chēng)為函數(shù)作用域,例如下列代碼中的blogName和函數(shù)innerSay都只擁有局部作用域。

function doSomething(){
var blogName="夢(mèng)想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(blogName); //腳本錯(cuò)誤
innerSay(); //腳本錯(cuò)誤 

相關(guān)文章

最新評(píng)論