實現fn(2)(4)的列印結果為8
function (a) {
return function (b) {
console.log(a*b)
}
}
fn(2)(4)
複製程式碼
什麼是原型鏈
每個物件都會在其內部初始化一個屬性,就是prototype(原型),當我們訪問一個物件的屬性時,如果這個物件內部不存在這個屬性,那麼他就會去prototype裡找這個屬性,這個prototype又會有自己的prototype,於是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。
關係:instance.constructor.prototype = instance.proto
定位
論position的屬性都有哪些
static:預設的屬性值,按照標準流(包括浮動方式)進行佈局。
relative:稱為相對定位,使用相對的盒子的位置常以標準量的排版方式為基礎,然後使盒子相對於它在原本的標準位置偏移指定的距離.相對定位仍在標準流中,它對父塊和兄弟塊盒子沒有任何影響。
absolute:絕對定位,盒子的位置以它的包含框為基準進行偏移。絕對定位從標準流中脫離,並且以它最近的一個已經定位的祖先元素為基準進行定位。沒有已經定位的祖先元素,則以瀏覽器視窗為基準進行定位 。 inherit:規定從父元素繼承 position 屬性的值。
fixed:固定定位,與絕對定位類似,以瀏覽器視窗為基準進行定位,拖動瀏覽器視窗的滾動條時,位置保持不變。
sticky: 粘性定位是相對定位和固定定位的混合。元素在跨越特定閾值前為相對定位,之後為固定定位。
vue都有哪些生命週期
beforeCreate 元件例項剛被建立
created 元件例項建立完,屬性已被繫結,但是dom還未生成
beforeMount 模板編譯掛載前
mounted 模板編譯掛載後
beforeUpdate 元件更新之前
updated 元件更新之後
activated keep-alive啟用時呼叫
deactivated keep-alive移除時呼叫
beforeDestroy 元件銷燬前呼叫
destroyed 元件銷燬後呼叫
errorCapture 錯誤時被呼叫
複製程式碼
瀏覽器標準模式和怪異模式之間的區別是什麼
在HTML與CSS的標準化未完成之前,各個瀏覽器對於HTML和CSS的解析有各自不同的實現,而有很多舊的網頁都是按照這些非標準的實現去設計的。在HTML與CSS標準確定之後,瀏覽器一方面要按照標準去實現對HTML與CSS的支援,另一方面又要保證對非標準的舊網頁設計的後向相容性。因此,現代的瀏覽器一般都有兩種渲染模式:標準模式和怪異模式。在標準模式下,瀏覽器按照HTML與CSS標準對文件進行解析和渲染;而在怪異模式下,瀏覽器則按照舊有的非標準的實現方式對文件進行解析和渲染。這樣的話,對於舊有的網頁,瀏覽器啟動怪異模式,就能夠使得舊網頁正常顯示;對於新的網頁,則可以啟動標準模式,使得新網頁能夠使用HTML與CSS的標準特性。
在標準模式下,一個塊的總寬度= width + margin(左右) + padding(左右) + border(左右)
在怪異模式下,一個塊的總寬度= width + margin(左右)(即width已經包含了padding和border值)
宣告式函式和表示式函式的區別
function a () {
return '函式宣告';
}
var b = function () {
return '函式表示式';
}
複製程式碼
Javascript 中函式宣告和函式表示式是存在區別的,函式宣告在JS解析時進行函式提升,因此在同一個作用域內,不管函式宣告在哪裡定義,該函式都可以進行呼叫。而函式表示式的值是在JS執行時確定,並且在表示式賦值完成後,該函式才能呼叫。
js哪些操作會實行隱式轉換
數值自動轉換為字串
var a = 123;
alert(a+'4'); // 輸出 1234 “+”號為連線符
複製程式碼
字串自動轉換為數字
var b = 1;
alert(b-'1'); // 減法 輸出 0
alert(b*'2'); // 乘法 輸出 2
alert(b/'1'); // 除法 輸出 1
alert(b%'1') // 求餘 輸出0
複製程式碼
“++”和“–”的型別轉換
var c = '10';
c++;
alert(c); // 輸出 11
var d = '10';
d--;
alert(d); // 輸出 9
複製程式碼
比較運算子的型別轉換
alert('10' > 1) // 輸出 true
alert('10' > '20') // 輸出 false
複製程式碼
等號運算子的轉換
alert('10' == 10) // 輸出 true
alert('10' === 10) // 輸出 false
複製程式碼
“!” 運算子的轉換
alert(!true); // 輸出false
alert(!false); // 輸出 true
alert(!100); // 輸出false
alert(!'哈哈哈哈哈'); // 輸出 false
複製程式碼
運算子其他之間的轉換返回NaN
alert('哈哈哈'-10) // 輸出NaN
複製程式碼
用javascipt寫一個方法,模擬實現bind方法
//bind() 方法會建立一個新函式。
//當這個新函式被呼叫時,bind() 的第一個引數將作為它執行時的 this
//之後的一序列引數將會在傳遞的實參前傳入作為它的引數。(來自於 MDN )
Function.prototype.fakeBind = function(context) {
if (typeof this !== "function") {
throw new Error("Bind must be called on a function");
}
let self = this;
// 獲得第一個引數以外的其他引數
let args = Array.prototype.slice.call(arguments, 1);
let inner = function() {
// 獲得返回函式執行時被傳入的引數
let innerArgs = Array.prototype.slice.call(arguments);
// 1 new 情況下,this 指向例項。此時 bind 時指定的 this 值應予以失效;
// 2 例項 instanceof 建構函式 返回值 true、false,確定是否為 new 呼叫;
// 3 匿名函式直接呼叫 this 指向全域性物件。此時應予以修改 this 的繫結
return self.apply(
this instanceof inner ?
this :
context, args.concat(innerArgs)
);
};
// inner.prototype = this.prototype
// 按上面這麼寫的話,修改 返回函式原型物件(inner.prototype)的同時把 繫結函式的原型物件(this.prototype)也同時修改了。
// 用匿名函式做中轉,this.protptype 就安全了。畫個原型鏈的圖就清楚了。
//注②
let fNOP = function() {};
fNOP.prototype = this.prototype;
inner.prototype = new fNOP();
return inner;
};
複製程式碼