一
var name = "the window";
var object = ;}};
alert(object.getnamefunc()());
題中有兩個alert輸出,我們首先看第乙個alert,這個alert所在的函式是在最後乙個alert裡面被呼叫的,呼叫的時候,裡面的this指向的是object,所以是在object裡面去找name屬性,所以第乙個輸出my object。再看第二個,呼叫object.getnamefunc()的時候返回的是乙個函式體,函式體此時後面有括號,此時這個函式就是在window裡面呼叫的,所以去window裡面name,所以第二個輸出the window。
二
var name = "the window";
var object = ;}};
alert(object.getnamefunc()());
這個題和上面乙個題差不多,主要區別在於在第乙個alert下面用乙個that變數去儲存了this。第乙個alert依舊輸出that,第二個和前一道題一樣都是帶出了函式體,但此時的that引用的是object,或者說在賦值的時候就把object的this賦予了that,所以就算object.getnamefunc()()是在全域性作用域內,其返回值that.name依舊會去object裡面去找。所以最終的結果是連續兩個object.
三
function b(x, y, a)
b(1, 2, 3);
這個題主要考察arguments這個例項物件,首先我們了解一下arguments這個函式物件是什麼。在每乙個函式被建立好之後,都會有乙個arguments物件例項arguments,它內部儲存的是函式傳進來的實參,可以 通過類似於陣列下標的方式去引用。那麼回過來看題就很明顯了。題中的arguments[2]就是改變了第三個引數,所以輸出 出來的就是改完之後的值。
四
function a()
a.call(null);
這個題考察的主要是this關鍵字和call方法。我們都知道call可以去改變函式內部this指向。可以我們自己定義函式內this指向誰。但是此時call方法內引數為null,這個時候我們就要明白乙個點。call傳入null到底指向誰。首先我們來說乙個知識點,就是當call方法的第乙個引數是乙個null或者undefined,那麼call將把this指向全域性物件(window),所以這個時候就相當於
function a()
a.call(window);
所以最後的 結果是[object window]
五
var a = 100;
function test()
test();
alert(a);
這道題一共三個輸出,乙個個來看,第乙個a,在函式內部,函式內部沒有宣告乙個變數a。所以去全域性作用域裡面去找,全域性作用域裡面有乙個a。所以直接引用a,第乙個就輸出100。第二個a執行之前,變數a被重新賦值,因為沒有var關鍵字,所以在函式內不會重新宣告乙個變數a,所以會去改變全域性作用域裡面的a此時全域性作用域就是10,所以第二個a輸出10,那麼同理全域性作用域被改變了,所以第三個也是輸出10.
六
var l = 1;
var n = m = 0;
function myfun(x)
n = myfun(l);
function anotherfun(x)
m = anotherfun(n);
alert(n);
alert(m);
這道題稍微長一點,但是稍微看一下,這道題就很簡單,n 和 m 都是取函式的值,但是函式都沒有返回值,所以花裡胡哨一大段**,最後兩個輸出的都是undefined。
七
let name = 'outer';
function showname()
name = 'updatedouter';
showname()
這道題中宣告變數不是用var關鍵字,而是用的es6新增的let,關於let,我們先了解一下其屬性,主要可以總結為三點:
1.在 {} 裡面宣告只能在 {} 裡面有用,
2.let宣告的變數不能被提公升,只有當執行到這一步,變數才能使用,語法上稱之為"暫時性死區"
3.被let宣告過的變數不能重複宣告,否則報錯
了解了以上三點我們再來看下這道題,在函式外有乙個被let宣告的變數name,但是在函式內也有乙個let變數宣告的name,所以輸出並不會在函式外面找,但是由於上面總結的三點中的第二點,變數不能被提公升,所以前面輸入肯定是找不到這個變數,所以就會報錯。
八
var person =
};var getage = person.getage;
console.log(person.getage(), getage());
看這道題。物件person內定義了乙個age屬性和乙個getage方法,然後在看倒數第二行**,就是在window的作用域下定義了乙個getage,然後把person隊形中的getage函式賦值給這個變數所以在全域性作用域中就有
var getage = function()
然後我們再看輸出,首先是person.getage();就是去呼叫person裡面的getage方法,此時this指向的是person物件,所以就在物件中去找age這個屬性,找到了18,所以直接輸出18。第二個getage();這個就是把函式getage執行,函式getage在全域性作用域下,this指向window,由於在window下沒有找到window, 所以輸出undefined。
九
var a = {},
b = ,
c = ;
a[b] = 123;
a[c] = 456;
這道題考的是物件屬性的建立方法,物件建立屬性有兩種,
1.直接 . 例如obj.a = 『a』
2.使用 例如 var a = 『abc』; obj[a] = 『qwe』; 這樣 obj.abc 可以得到 qwe,就相當於把a的值abc作為obj的屬性名,qwe作為屬性值。
然後我們再來看這個題,都是利用來建立屬性,但是b c 都是物件,所以在引用的時候,會隱式呼叫tostring方法,物件呼叫tostring 方法之後返回值是[object object],所以在用的時候就會把[object object]作為屬性名,所以第一次賦值,屬性[object object]的值就會被賦予了兩次,而不是在物件內新建了兩個屬性,而是同乙個屬性[object object]
十
function a(m, n)
return b(m - n + 1);
}
console.log(a(4, 2));
這道題其實就是有點繞,不難,首先我們看輸出,輸出的時候往函式a裡面傳入了兩個實參,這時候函式a內,m = 4;n = 2; 然後到了函式a的返回值這時候就相當於 return b(3),然後在看函式b,此時傳入了乙個引數3,那麼l = 3; 進入函式。判斷 l <= m ,結果為true,所以執行前面的表示式。前面的表示式內又呼叫了乙個函式b,所以現在就是 3 * b(4),然後又進入了函式b的return 進入之後 l <= m, 還是為true ,所以繼續執行第乙個表示式,此時相當於 3 * (4 * b(5)),繼續進入b函式,此時 l <= m 為false 那麼就執行第二個表示式 1 ,結果就是 3 * (4 * 1)= 12,所以結果就是12.
var a =
var b = a;
a.n = a = ;
console.log(a,b);
var out = 25,
inner=
} console.log((inner.func, inner.func)());
console.log(inner.func());
console.log((inner.func)());
console.log((inner.func = inner.func)());
函式面試題
面試題的理解文件 第一題 var num function fun num 18 fun 理解 結果是undefined,但是num的值為18,函式裡面的num的值為20,這串 是由上到下的循序執行的,而這裡的num如果在函式裡面則會去找自己裡面的,如果有則會使用自己裡面的num,如果沒有則會去父級...
函式面試題
var a 1 function b b console.log a 輸出 1 解析 輸出的a是window下的 function foo return bar function bar alert foo 輸出 8 解析 涉及預編譯問題,兩個方法名同名,後宣告的覆蓋之前的所以這裡輸出8 funct...
js變數面試題
全域性作用域和區域性作用域 全域性作用域 整個js執行環境 區域性作用域 通過建立乙個函式就開闢出了乙個區域性作用域 全域性變數和 區域性變數 全域性變數 在全域性作用域都可以訪問的變數 區域性變數 只能在當前區域性作用域訪問的 變數宣告提公升 如果變數宣告在函式裡面,則將變數宣告提公升到函式的開頭...