实现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;
};