1. 程式人生 > >剛剛遇到的幾道題,感覺自己還是有很多的知識點都不清楚,記錄下

剛剛遇到的幾道題,感覺自己還是有很多的知識點都不清楚,記錄下

第一道

var myObject = {

foo: "bar",

func: function() {

var self = this;

console.log(this.foo);  

console.log(self.foo);  

(function() {

console.log(this.foo);  

console.log(self.foo);  

}());

}

};

myObject.func();

求的是該程式輸出的是什麼?

結果是:

bar
bar
undefined
bar

第三個不明白,看了解析才恍然大悟,原來是這樣

解析:

1.第一個this.foo輸出bar,因為當前this指向物件myObject。

2.第二個self.foo輸出bar,因為self是this的副本,同指向myObject物件。

3.第三個this.foo輸出undefined,因為這個IIFE(立即執行函式表示式)中的this指向window。

4.第四個self.foo輸出bar,因為這個匿名函式所處的上下文中沒有self,所以通過作用域鏈向上查詢,從包含它的父函式中找到了指向myObject物件的self。

第二道

function Foo(){

var i=0;

return function(){

document.write(i++);

}

}

var f1=Foo(),

f2=Foo();

f1();

f1();

f2();

請問以上程式的輸出是()

答案是:010

第二個不懂

解析

這是一個閉包,閉包可以用在許多地方。它的最大用處有兩個,一個是前面提到的可以讀取函式內部的變數,另一個就是讓這些變數的值始終保持在記憶體中。  這裡的區域性變數i,對f1()來說是全域性變數,對f2()來說也是全域性變數,但是f1()的i跟f2()的i又是相互獨立相互不可見的,f1()每執行一次,f1()的i就加一,f2()每次執行一次,f2()的i就加油,但是相互之間不影響,因此結果是010

第三道

在檔案/home/somebody/workspace/somemodule.js中第一行引用了一個模組:require(‘othermodule‘),請問required 的查詢模組的順序 A. /home/somebody/workspace/node_modules/othermodule/index.js B. /home/somebody/workspace/node_modules/othermodule. Js C.CORE MODULES named othermodule D./home/somebody/node_modules/othermodule/index.js

答案是:CBAD

解析

(1):首先,Node在當前目錄下查詢package.json(CommonJS包規範定義的包描述檔案),通過JSON.parse()解析出包描述物件,從中取出main屬性指定的檔名進行定位。如果檔案缺少副檔名,將會進入副檔名分析的步驟。   (2):而如果main屬性制定的檔名錯誤,或者壓根沒有package.json檔案,Node會將index當做預設檔名,然後依次查詢index.js、index.node、index.json.   (3):如果在目錄分析的過程中沒有定位成功任何檔案,則自定義模組進入下一個模組路徑進行查詢。如果模組路徑陣列都被遍歷完畢,依然沒有查詢到目標檔案,則會丟擲查詢失敗異常。   按照上面的思路,首先應該查詢package.json檔案,看看裡面有沒有核心模組,應該是C最先,othermodule不是核心模組,那麼接著應該進入副檔名分析的步驟,就應該是查詢othermodule. js,對應B,緊接著就是以index為預設檔名,也就是A,再接下來就是上一個檔案目錄D了, 所以答案是: C B A D