您好,登錄后才能下訂單哦!
JavaScript中的求值策略有哪些?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
1.可以使網頁具有交互性,例如響應用戶點擊,給用戶提供更好的體驗。 2.可以處理表單,檢驗用戶的輸入,并提供及時反饋節省用戶時間。 3.可以根據用戶的操作,動態的創建頁面。 4使用JavaScript可以通過設置cookie存儲在瀏覽器上的一些臨時信息。
function changeStuff(a, b, c) { a = a * 10; b.item = "changed"; c = {item: "changed"}; } var num = 10; var obj1 = {item: "unchanged"}; var obj2 = {item: "unchanged"}; changeStuff(num, obj1, obj2); console.log(num); // 10 console.log(obj1.item); // changed console.log(obj2.item); // unchanged
如果說js中函數的參數傳遞是按值傳遞,那么在函數changeStuff內部改變b.item的值將不會影響外部的obj1對象的值。
如果說JS中函數的參數傳遞是按引入傳遞,那函數changeStuff內部所做的改變將會影響到函數外部所有的變量定義,num將會變成100、obj2.item將會變成changed。很顯然實際不是這樣子的。
所以不能說JS中函數的參數傳遞嚴格按值傳遞或按引入傳遞。總的來說函數的參數都是按值傳遞的。JS中還采用一種參數傳遞策略,叫按共享傳遞。這要取決于參數的類型。
如果參數是基本類型,那么是按值傳遞的;
如果參數是引用類型,那么是按共享傳遞的。
ECMAScript 中所有函數的參數都是按值傳遞的。也就是說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。基本類型值的傳遞如同基本類型變量的復制一樣,而引用類型值的傳遞,則如同引用類型變量的復制一樣。-- 《JavaScript高級程序設計》
JavaScript中基本類型作為參數的策略為按值傳遞(call by value):
function foo(a) { a = a * 10; } var num = 10; foo(num); console.log(num); // 10 沒有變化
這里看到函數內部參數的改變并沒有影響到外部變量。按值傳遞沒錯。
JavaScript中對象作為參數傳遞的策略為按共享傳遞(call by sharing):
修改參數的屬性將會影響到外部對象
重新賦值將不會影響到外部對象
按上面栗子函數內部修改了參數b的屬性item,會影響到函數外部對象,因而obj1的屬性item也變了。
function bar(b) { b.item = "changed"; console.log(b === obj1) // true } var obj1 = {item: "unchanged"}; bar(obj1); console.log(obj1.item); // changed 修改參數的屬性將會影響到外部對象
從b === obj1打印結果為true可以看出,函數內部修改了參數的屬性并沒有影響到參數的引用。b和obj1共享一個對象地址,所以修改參數的屬性將會影響到外部對象。
而將參數c重新賦值一個新對象,將不會影響到外部對象。
function baz(c) { c = {item: "changed"}; console.log(c === obj2) // false } var obj2 = {item: "unchanged"}; baz(obj2); console.log(obj2.item); // unchanged 重新賦值將不會影響到外部對象
將參數c重新賦值一個新對象,那么c就綁定到了一個新的對象地址,c === obj2打印結果為false,判斷他們不再共享同一個對象地址。它們各自有獨立的對象地址。所以重新賦值將不會影響到外部對象。
可以說按共享傳遞是按值傳遞的特例,傳遞的是引用地址的拷貝。所以紅寶書上說的也沒錯。
可以把 ECMAScript 函數的參數想象成局部變量。-- 《JavaScript高級程序設計》
前面了解到了所有函數的參數都是按值傳遞的。JavaScript 中參數是必須先求值再作為實參傳入函數的。但是在ES6中有一個特例。
參數默認值不是傳值的,而是每次都重新計算默認值表達式的值。也就是說,參數默認值是惰性求值的。 -- 《ECMAScript 6 入門》
let x = 99; function foo(p = x + 1) { console.log(p); } foo() // 100 x = 100; foo() // 101
上面代碼中,參數p的默認值是x + 1。這時,每次調用函數foo,都會重新計算x + 1,而不是默認p等于 100
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。