問題一:請解釋JavaScript中的閉包是什么?
function add(x) { return function(y) { return x + y; }; } const add5 = add(5); console.log(add5(2)) // 7
在這個例子中,add函數(shù)返回一個新函數(shù),該新函數(shù)接收一個參數(shù),它和add函數(shù)的參數(shù)x共同形成一個閉包。閉包可以訪問其包含函數(shù)中的變量。在這種情況下,閉包可以訪問add函數(shù)的參數(shù)x,這使它可以將傳入的參數(shù)y添加到x中并返回結(jié)果。
問題二:什么是JavaScript的異步編程方式?
JavaScript有兩種主要的異步編程方式:使用回調(diào)函數(shù)和使用Promise。
// 使用回調(diào)函數(shù) function loadImage(url, callback) { const img = new Image(); img.onload = function() { callback(null, img); }; img.onerror = function() { callback(new Error('could not load image')); }; img.src = url; } loadImage('https://www.baidu.com/img/bd_logo1.png', function(error, img) { if (error) { console.error(error); } else { console.log(img.width); } }); // 使用Promise function loadImage(url) { return new Promise(function(resolve, reject) { const img = new Image(); img.onload = function() { resolve(img); }; img.onerror = function() { reject(new Error('could not load image')); }; img.src = url; }); } loadImage('https://www.baidu.com/img/bd_logo1.png') .then(function(img) { console.log(img.width); }) .catch(function(error) { console.error(error); });
在上面的代碼示例中,loadImage函數(shù)通過回調(diào)函數(shù)和Promise兩種方式演示了異步編程。使用回調(diào)函數(shù)時,當圖像加載成功或失敗時,調(diào)用callback函數(shù)并傳遞相應的參數(shù)。使用Promise時,為loadImage函數(shù)返回一個Promise對象,并在圖像加載成功或失敗時分別調(diào)用resolve和reject函數(shù)。
問題三:JavaScript中的this關(guān)鍵字的作用是什么?
this關(guān)鍵字在JavaScript中用于指定當前上下文的作用域。它可以在不同的上下文中具有不同的值,例如在全局上下文中,this指向全局對象,在函數(shù)上下文中,this指向該函數(shù)被調(diào)用的對象。
const person1 = { name: 'Alice', sayName: function() { console.log(this.name); } }; person1.sayName(); // Alice const person2 = { name: 'Bob' }; person2.sayName = person1.sayName; person2.sayName(); // Bob
在上面的代碼示例中,當調(diào)用person1.sayName時,this指向person1對象,因此可以打印其名稱屬性值。當person1.sayName函數(shù)復制到person2對象并調(diào)用它時,this將指向person2對象,因為它成為調(diào)用該函數(shù)的對象。
總之,JavaScript面試中可以提出各種各樣的問題,并且求職者應該對它們有所了解。在回答問題時,可以使用簡潔的代碼示例或使用易于理解的語言來解釋復雜的概念。