JS容易理解錯誤的地方

2021-09-07 20:46:11 字數 1891 閱讀 5502

在這端**執行的末尾,你會不會hi變數回事函式中的hi了?你會不會認為這不是按引用傳遞了? 對值傳遞和引用傳遞產生質疑了?

1 var hi = {};

2 function sayhello(hi)

hi = ;

console.log(yongshiyule178.com'in function hi : ' + hi.a);

alert(hi.a);

}sayhello(hi);

console.log(www.mcyllpt.com 'out function: ' + hi.a); // 此時函式外的hi還是{}

辨析:1 是實參hi

2 是形參hi

雖然名字同名但同名不是同乙個變數,是兩個不同的變數,雖然同名同名,但存放的記憶體位置不同。

同名會迷惑你。

實參hi是乙個物件,在sayhello被呼叫時,會將引用賦值給形參hi,在函式內部我們將乙個新物件賦值給形參hi,這時形參hi的引用發生了變化,指向了新的物件,但實參hi的引用並沒有發生變化,所以函式呼叫後實參hi還是那個實參hi,這個函式值傳遞形式還是按引用傳遞,只不過我們在函式內部改變了形參hi的引用指向。如果不改變引用指向,可以在函式中修改實參hi的屬性值。

不要被表象所迷惑。

這個問題是我在閱讀seajs的原始碼發現的困惑,為什麼這樣寫,在另乙個模組中require是不能獲取到暴露出的物件:

seajsutil.js

define(function (require, exports, module) ;

});seajsdemo.js

define(function (require, exports, module) );

理解了以上的困惑,就告訴我們正確的暴露物件的方法是:

// 這樣才是使用exports暴露變數和屬性的正確姿勢,exports本身是乙個空物件{},要在空物件上進行新增屬性和函式

define(function (require, exports, module)

});// 直接return物件或者屬性,這樣就迴避了exports屬性暴露,使用return直接暴露,使用return可以暴露各種型別的值。

// 是的適合,使用起來感覺比exports更便捷。暴露模組內容的方法可以是情況進行選擇。

define(function (require, exports, module) ;

});//這是seajs的暴露模組屬性的**:

/*** 如果建構函式factory不返回,則exports取mod.exports變數作為返回物件。也即是seajs模組的的互動,控制代碼持有的對

* 象,要麼是factory的return物件,要麼是exports對外發布的物件。

* factory被賦予的exports是乙個物件,所以通過exports暴露的就是乙個物件。

*/var exports = isfunction(factory) ?

factory(require, mod.exports = {}, mod) :

factory

if (exports === undefined)

// reduce memory leak

delete mod.factory

mod.exports = exports

mod.status = status.executed

// emit `exec` event

emit("exec", mod)

return exports

/*** require返回mod.exports,供其他模組接收使用.

* require返回的exports變數,模組要給exports變數賦值

*/seajs.require = function (id)

return mod.exports

ucos容易錯誤的地方

1 在ucos中斷中,如果沒有呼叫作業系統的服務函式 如傳送訊號量等 則在中斷中,不需要要呼叫才做系統的 進入中斷 函式osintenter 和 退出中斷 函式osintexit 見周航慈的p125和p75頁。2 關於互斥訊號量得核心,是在使用呼哧訊號量進行資源同步的時候,任何任務一旦獲得共享資源,...

hadoop資料容易出現錯誤的地方

最近在搞關於資料分析的專案,做了一點總結。下圖是系統的資料流向。容易出現錯誤的地方。1 資料進入hadoop倉庫 有四種 這四種是最基本的資料,簡稱ods,original data source,後續 的資料都是有這些組合而來 a 日誌檔案 b http介面 c db查詢 d 建表指向 最後資料都...

AJAX容易出錯地方,錯誤處理

myajax.js 建立路由器物件 const express require express 引入連線池模組 const pool require pool.js 建立路由器物件 var router express.router 測試伺服器接收ajax請求的介面 router.get ajaxd...