以下內容為閱讀 5 Typical JavaScript Interview Exercises 文章後的觀後感。
這幾個問題說基本也滿基本的但是有些地方一不小心可能就會犯錯!
問題一:Scope
(function() { |
請問
console.log(b); 印出來的結果是?答案
5在這個 IIFE 中,變數
a 使用了 var 關鍵字來宣告成為 local variable,而 b 則沒有 var 修飾所以宣告成為 global variable。那如何避免這個問題呢?只需要在 IIFE 中加入
'use strict',如此一來只要有任何變數試圖宣告為全域變數都會出現錯誤警告。(function() { |
所以假若你還是要把
b 宣告為全域變數 (global variable) 則可以透過 window.b 來指定。問題二:Create “native” methods
擴充 String 的 method 使其能呼叫
.repeatify(num) 來產生重複的字串console.log('hello'.repeatify(3)); |
並且印出
hellohellohello答案
String.prototype.repeatify = String.prototype.repeatify || function(times) { |
這題應該就比較簡單了,直接從
String.prototype 下手,並使用String.prototype.repeatify || function(times) 來避免覆寫已經存在的方法。這個技巧很常用在一些
shim 的功能 (用來擴充本來瀏覽器沒有提供的功能)。問題三:Hoisting
寫出以下程式碼執行結果,並說明原因。
function test() { |
答案
第一個
第二個
第一個
undefined第二個
2所有的變數 (Variable) 與 函式 (Function) 都會被往上提 hoisted 至 Function 的頂端。但是要注意的是,變數往上提並不會一起賦值。所以
a 印出來是 undefined,我們把上面的 code 轉換成提升後等價的 code 如下:function test() { |
這樣是否更能明白了呢?其實我看這篇文章之前對於這個
hosited 概念十分陌生,可以參見另一篇文章 Back to Basics: JavaScript Hoisting問題四:How this work in JavaScript
寫出以下程式碼執行結果,並說明原因。
var fullname = 'John Doe'; |
第一個
第二個
Colin Ihrig第二個
John DoeJavaScript 很不一樣的一點就是
this 並不是跟著 instance 走。而是依據誰呼叫 (invoke) 來決定this 的參考值。(這也常讓不熟稔 JS 的人嘗盡苦頭)…第一個
Colin Ihrig 是因為 getFullname() 呼叫是由 obj.prop 發出,此時this.fullname 即為 obj.fullname;而第二個 John Doe 則是由 window 呼叫 test 實際上是 obj.prop.getFullname 因此 this.fullname === window.fullname 於是便印出John Doe。問題五:call() and apply()
修正上面題目,要把第二個印出的答案變為
Colin Ihrig 該如何做?console.log(test.call(obj.prop)); |
基本上
call() 與 apply() 用法差異如下:function.call(thisArg[, argument1[, argument2[, ...]]]); |
所有語法大致上與 apply() 相同,他們基本上不同處只有 call() 接受一連串的參數,而 apply() 單一的array作為參數 —- MDN
以上簡單分享,自己也重新複習一遍了…Q_Q
ps. 原文的下面還有一些回覆,並且提供另一些題目。我們改天再一起來研究看看!
0 意見:
張貼留言