如上不能給g賦值一個新值,我想寫一個fn函數,可以任意給外部的變數賦值
#實際需求如上,我要將實例化後的變數賦值給外部
PHPz2017-05-19 10:41:36
題主沒理解的一個概念,就是函數參數的傳遞方式的問題。
var g = 1;
function fn(a){a=2;}
fn(g);
g//1
//我是分割线
var g = {a:1};
function fn(b){b.a=2;}
fn(g);
g//{a:2}
當外部變數作為參數傳入函數時,你需要理解兩種情況,一個是基本資料類型,一個是物件。
參數為基本資料型別時,函數裡參數傳的是值傳遞,也就是把值拷貝到參數去,函數怎麼對參數值做改動,也只是對實參的拷貝做改動,不會影響到本體,如你截圖所示。
而當參數是對象的時候,我其實也認為是值傳遞,只是傳遞的是對象的引用地址值,函數內部對這個引用對像地址進而索引到真實數據對象,然後去改變對象內的屬性,這個就是會影響到外在的情形。
一般來說,你如果想任何給外部的變數賦值。你倒不如不以傳參的方式去傳遞變量,而是直接在函數體內做處理。
var g;
function fn(){
g = 1;
}
fn();
g//1
根據function找出變數規則,先在本次執行體內查找變數是否有g,如果沒有再往外層找,直到最外層還沒有,那就是這個變數沒定義沒聲明過了。
習慣沉默2017-05-19 10:41:36
javascript的函數參數傳遞都是」值傳遞「。
一個比較合理寫法是
var g;
function fn() {
return 33
}
g = fn();
不太合理的寫法
var g;
function fn() {
g = 33;
}
fn();
後者不太合理的原因三在於耦合程度太高。
大家讲道理2017-05-19 10:41:36
var g;
function fn(){
g = '32';
}
fn();
這個能完成你需要的,但是你應該是要個通用的吧?
你可以选择这样:
var g;
function fn(){
return '32';
}
g = fn();