1.mouseenter 和mouseover的区别(面试题)
1).当鼠标移动到元素上时就会触发mouseenter 事件
2).类似 mouseover,它们两者之间的差别是:
(1).mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发。mouseenter 只会经过自身盒子触发
(2).之所以这样,就是因为mouseenter不会冒泡
(3).跟mouseenter搭配鼠标离开 mouseleave 同样不会冒泡
2.const 关键字赋值
-
js中的const只能修饰栈区,不能直接修饰堆区
const arr = [1,2,3]; arr[0] = 666;//可以改
const arr = [1,2,3]; const arr1 = [4,5,6]; arr = arr1;//不可以改
3.闭包
好比在java中,用类中公有的方法访问私有的变量
父函数 子函数 父函数局部变量
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
什么是闭包:闭包是指在函数外部访问函数作用域中变量(局部变量)的函数;或者说闭包就是能够读取其他函数内部变量的函数;或者说闭包是指有权访问另一个函数作用域中的变量的函数;
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
通俗解释:
闭包是指有权访问另外一个函数作用域中的变量的函数.可以理解为(能够读取其他函数内部变量的函数)
闭包:函数嵌套函数,被嵌套的函数称为闭包函数
子函数可以作为父函数的返回值,通过外部全局变量与子函数进行绑定
从而延长子函数的生命周期,父函数的局部变量的生命周期也同样被延长
通过外部的全局变量可以间接操作子函数,实现对父函数局部变量在函数体外的访问
闭包的作用
正常函数执行完毕后,里面声明的变量被垃圾回收处理掉,但是闭包可以让作用域里的变量,在函数执行完之后依旧保持没有被垃圾回收处理掉
1.可以读取函数内部的变量
2.让这些变量的值始终保持在内存中。
3.增加块级作用域
JS中,没有块作用域,但是在闭包的写法里,可以体现出来。
闭包的缺陷
延长局部变量的生命周期,有可能会造成内存泄露
4.利用闭包的方式得到当前li 的索引号(经典面试题)
for (var i = 0; i < lis.length; i++) {
// 利用for循环创建了4个立即执行函数
// 立即执行函数也称为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
(function(i) { //这个i是后面小括号的i传递过来的
lis[i].onclick = function() { //function函数里面用的i是从另一个函数里面传递过来的,即使用了另外一个函数的变量,闭包产生 闭包就是立即执行函数
console.log(i); //点击之后才把i打印出来
}
})(i); //后面的这个小括号算是调用调用函数
}
5.闭包应用-3秒钟之后,打印所有li元素的内容
for (var i = 0; i < lis.length; i++) { // var 修饰i
(function(i) {
setTimeout(function() {
console.log(lis[i].innerHTML);
}, 3000)
})(i);
}
6.请问jsonp是不是ajax中实现跨域访问的技术
jsonp不是AJAX中实现跨域访问的技术
1)、jsonp没有使用XMLHttpRequest对象。
2)、jsonp只是在一种跨域的技巧。
3)、jsonp只支持Get方式
由于按照jsonp的这种方式跨域访问时,好像可以利用javascript和服务器端交互,能达到AJAX中XMLHttpRequest对象同样的效果。所以,人们总是把jsonp和AJAX联系在一起。
7.jsonp和json的区别?
1)、jsonp和json根本就没有关系
2)、jsonp是跨域访问的技巧
3)、json是描述数据的格式
8.typeof和instanceof的异同?
1). typeof,用来检测数据类型
返回值是一个字符串,用来说明变量的数据类型。
'undefined' :这个值未定义。
'boolean':这个值是布尔值。
'string' :这个值是字符串。
'number' :这个值是数值。
'object':这个值是对象或null。
'function' :这个值是函数。
2). 应用:typeof 来获取一个变量是否存在,如
if(typeof a!="undefined"){alert("ok")}
3). 对于 Array,Null 等特殊对象使用 typeof 一律返回 object,这正是 typeof 的局限性。
instanceof
1). instanceof,用来检测该对象是否为某种类型的实例
2). 也可以用来判断某个构造函数的prototype属性是否存在另外一个要检测对象的原型链上。
注意:instanceof类型兼容性规则,子类的实例化对象也是父类的实例
var a=new Array();
alert(a instanceof Array); // true
alert(a instanceof Object) // true
这是因为 Array 是 object 的子类。