this在方法賦值過程中無法保持(隱式丟失)

2022-02-09 04:52:45 字數 729 閱讀 8561

在看《高階程式設計》(我的紅寶書) p.183頁時遇到下面乙個問題

var name = "77";

var obj =

};(obj.getname = obj.getname)(); //

返回全域性變數 77

這個問題看起來好像有點奇葩,其實它可以從以下兩個方面切入。

一、  在於obj.getname = obj.getname這個賦值的問題。我們可以先看一下規範對 a = b; 的解釋,它其實發生了四步操作:

計算表示式a,得到a的位址refa;

計算表示式b, 得到b的值valueb;

將valueb賦給refa。

返回valueb

從上面的賦值過程中我們可以看到 obj.getname = obj.getname 會返回第二個 obj.getname 所指向的函式表示式。

於是就可以將(

obj.getname = obj.getname)()

視作全域性函式。這個問題便可以看做

var name = "77";

var obj =

};var fn =obj.getname;

fn();

//返回全域性變數 77

二、this的值基於呼叫的位置

所以在全域性中呼叫函式的時候 this 指向window,所以他會返回 77,而不是88.

Oracle 過程中變數賦值

create or replace function get sal1 id employees.employee id type return number is sal employees.salary type begin sal 0 select salary into sal from e...

在儲存過程中實現事務

在圖書館管理系統中系統管理員可以進行的操作有 借 還 新增 刪除 修改圖書或新增 刪除 修改讀者等,很多的操作都涉及到多個表的進行,我們一定要保持資料的一致性。如 刪除讀者 操作,會在讀者表 reader 中進行讀者的刪除,該讀者刪除後,借書表 reader book 也沒有必要再保留該讀者的借書記...

sqlserver中在儲存過程中寫事務

由於對資料的操作經常需要併發,所以在儲存過程中使用事務是非常必要的,我經常這樣處理 if exists select from sys.objects where name sp drop proc sp gocreate procedure sp 引數列表.out bit 0 output 輸出引...