問題1: 作用域(Scope)
考慮以下代碼:
(function() { var a = b = 5;})();console.log(b);控制臺(console)會打印出什么?
答案:5
如果 嚴格模式開啟,那么代碼就會報錯 ” Uncaught ReferenceError: b is not defined” 。請記住,如果這是預期的行為,嚴格模式要求你顯式地引用全局作用域。所以,你需要像下面這么寫:
(function() { 'use strict'; var a = window.b = 5;})();console.log(b);問題2: 創建 “原生(native)” 方法
在 String 對象上定義一個 repeatify 函數。這個函數接受一個整數參數,來明確字符串需要重復幾次。這個函數要求字符串重復指定的次數。舉個例子:
console.log('hello'.repeatify(3));
應該打印出hellohellohello.
答案:
String.prototype.repeatify = String.prototype.repeatify || function(times) { var str = ''; for (var i = 0; i < times; i++) { str += this; } return str;};在這里,另一個關鍵點是,看你怎樣避免重寫可能已經定義了的方法。這可以通過在定義自己的方法之前,檢測方法是否已經存在。
String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};
問題3: 變量提升(Hoisting)
執行以下代碼的結果是什么?為什么?
function test() { console.log(a); console.log(foo()); var a = 1; function foo() { return 2; }}test();答案:
這段代碼的執行結果是undefined 和 2。
這個結果的原因是,變量和函數都被提升(hoisted) 到了函數體的頂部。因此,當打印變量a時,它雖存在于函數體(因為a已經被聲明),但仍然是undefined。換言之,上面的代碼等同于下面的代碼:
function test() { var a; function foo() { return 2; } console.log(a); console.log(foo()); a = 1;} test();問題4: 在javascript中,`this`是如何工作的
以下代碼的結果是什么?請解釋你的答案。
var fullname = 'John Doe';var obj = { fullname: 'Colin Ihrig', prop: { fullname: 'Aurelio De Rosa', getFullname: function() { return this.fullname; } }};console.log(obj.prop.getFullname());var test = obj.prop.getFullname;console.log(test());答案:
這段代碼打印結果是:Aurelio De Rosa 和 John Doe 。原因是,JavaScript中關鍵字this所引用的是函數上下文,取決于函數是如何調用的,而不是怎么被定義的。
在第一個console.log(),getFullname()是作為obj.prop對象的函數被調用。因此,當前的上下文指代后者,并且函數返回這個對象的fullname屬性。相反,當getFullname()被賦值給test變量時,當前的上下文是全局對象window,這是因為test被隱式地作為全局對象的屬性。基于這一點,函數返回window的fullname,在本例中即為第一行代碼設置的。
新聞熱點
疑難解答
圖片精選