ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript_javascript のヒントでスコープ外の変数を変更する方法

JavaScript_javascript のヒントでスコープ外の変数を変更する方法

WBOY
WBOYオリジナル
2016-05-16 15:08:231673ブラウズ

1. 今日は JavaScript 学習ガイドを読みながら放課後の演習を行ったので、関数で渡されるパラメーターについて詳しく徹底的に学習しました。

トピックは次のとおりです:

関数はスコープ外の変数を変更するにはどうすればよいですか? 関数を呼び出した後、数値項目は対応する文字列表現に置き換えられます。

次の知識ポイントに注意する必要があります:

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= 
上記のコードでは、数値、ブール値、配列、オブジェクトの 2 つの関数、表示とテストの 4 つのグローバル変数を作成しました。


表示を 4 回実行し、結果は次のとおりです。


「番号:2

」 ブール値: true
配列:1,2,3
object:122"
関数に渡されたときの値

「番号:0

」 ブール値:false
配列:1,2,3,3
オブジェクト:134"<-変更を実行

「番号:0

」 ブール値:false
配列:3,2,1
オブジェクト:133"<-再割り当て

「番号:2

」 ブール値: true
配列:1,2,3,3
object:134"<-関数の実行後

配列とオブジェクトの再割り当てが成功しなかったことがわかります。参照によって渡された場合は、グローバル変数の配列とオブジェクトも再割り当てして変更する必要があります。

実は、JavaScript におけるいわゆる参照による代入は、本当の意味での参照によるコピーではなく、共有による受け渡しとも言えます。

この共有渡しの条件では、取得した参照は実際のパラメータ参照のコピーにすぎないと言えます。よく言われる参照渡しとの最大の違いは、参照コピーへの割り当てです。実際のパラメータの値には影響しません。上で行ったように、代入操作は実行できません。


もちろん、オブジェクト型と基本型の両方に注目します。オブジェクトは変更可能であり、基本型は不変です (注: 文字列の変更は実際には新しい文字列が返されます)。そのため、共有による受け渡しも基本型に対して行われます。シェアによる配信付き。


要約すると、


JavaScript では、基本型とオブジェクトの両方が共有によって呼び出されます。ただし、JavaScript の基本型は不変であるため、オブジェクトは共有によって渡されますが、共有によって基本型を渡すことと値によって渡すことには違いはありません。 🎜>

共有による呼び出し: 渡されるのは実際のパラメータ参照のコピーです。参照コピーへの割り当ては実際のパラメータの値には影響しませんが、参照コピーは参照されたコンテンツの変更に使用できます。住所


渡される関数パラメータ:

1. 基本型、値によって渡される (または共有によって渡される)、内部割り当ての変更は呼び出し元のプログラムには影響しません

2. オブジェクト型は共有によって渡されます。渡されるのは、実際のパラメータ参照のコピーです。参照への内部割り当ては無効です。

私はおそらくそのように理解しています。もしどこかで間違いがあれば、指摘していただければ幸いです。

以下に JavaScript スコープを個別に取り出します

どのプログラミング言語にもスコープの概念があります。簡単に言えば、スコープは変数と関数のアクセス可能な範囲です。つまり、スコープは変数と関数の可視性とライフサイクルを制御します。 JavaScript には、グローバル スコープとローカル スコープの 2 種類の変数スコープがあります。


グローバルスコープ コード内のどこからでもアクセスできるオブジェクトにはグローバル スコープがあります。一般に、次の状況ではグローバル スコープがあります。

(1) 最も外側の関数と、最も外側の関数の外側で定義された変数は、グローバル スコープを持ちます。例:



(2) すべての未定義変数と直接割り当てられた変数は、グローバル スコープを持つように自動的に宣言されます。次に例を示します。
var authorName="山边小溪";
function doSomething(){
var blogName="梦想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(authorName); //山边小溪
alert(blogName); //脚本错误
doSomething(); //梦想天空
innerSay() //脚本错误

  变量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 までご連絡ください。