JavaScript 与其他语言的(如 Java)的重要区别是在 JavaScript 中语句块(blocks)是没有作用域的,只有函数有作用域。因此如果在一个复合语句中(如 if 控制结构中)使用 var 声明一个变量,那么它的作用域是整个函数(复合语句在函数中)。 但是从 ECMAScript Edition 6 开始将有所不同的, let
和 const
关键字允许你创建块作用域的变量。
for (var j = 0; j < images.length; j++) {
images[j].onclick = function () {
displayedImage.src = 'images/pic' + j + '.jpg';
console.log(j);
}
}
控制台输出的值一直为4;
用闭包可以解决这个问题。
for (var j = 0; j < images.length; j++) {
(function(j){
images[j].onclick = function () {
displayedImage.src = 'images/pic' + j + '.jpg';
console.log(j);
}
})(j)
}
或者用ES6的方法,把var 改成 let 。
2.
以下代码输出结果为
-
var a= 2018<0 || typeof(2018+"");
-
console.log(a);
答案:string
考察||,第一项为true,则返回第一项的结果,如果第一项是false,则不论第二项是什么,都返回。本题第二项为string
3.
var setPerson=function(person){
person.name="kevin";
person={name:"nick"};
};
var person={name:"alan"};
setPerson(person);
console.log(person.name); //"kevin"
先来看个例子
var a = {
name: '小王'
}
var b = a;
b = null;
console.log(a);
//输出 {name:'小王'}
我们知道 JavaScript 中的对象是引用对象, 所以 a 中存储的是对象的内存地址, 而对象存储在堆中, var b = a; 实际是将 b 的值设置为 a 对象中存储的地址, 再将 b设置为空对象 null , 也是将 b 的值改为空对象的栈内存地址, 所以说 b 的改变影响不到 a
通过上面的分析, 我们再回到题中, 向 setPerson() 函数中传递了一个对象, 可以看作是用外面的 person 对象赋值给 setPerson() 中的 person 局部对象, setPerson() 中的 person 对象只是指向了外面 person对象的地址, 当执行 person.name = "kevin" 时会根据对象地址访问对象, 然后修改 name 的值, 外面的person也就改变了, 但当执行 person = {name:"rick"}; 时, 是拿 setPerson() 中指向新的对象地址, 不会修改原来的对象
4.setTimeout的语法有多种。
var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
var timeoutID = scope.setTimeout(function[, delay]);
var timeoutID = scope.setTimeout(code[, delay]); //code要加引号呀
function
function
是你想要在到期时间(delay
毫秒)之后执行的函数。
code
这是一个可选语法,你可以使用字符串而不是function
,在delay
毫秒之后编译和执行字符串 (使用该语法是不推荐的, 原因和使用 eval()
一样,有安全风险)。
delay 可选
延迟的毫秒数 (一秒等于1000毫秒),函数的调用会在该延迟之后发生。如果省略该参数,delay取默认值0,意味着“马上”执行,或者尽快执行。不管是哪种情况,实际的延迟时间可能会比期待的(delay毫秒数) 值长,原因请查看Reasons for delays longer than specified。
param1, ..., paramN
可选
附加参数,一旦定时器到期,它们会作为参数传递给function
5. 阻止事件冒泡的两种方式:
1) e.cancelBubble = true;
2) e.stopPropagation();
是加在根事件上的哦,阻止向上冒泡。
6.var a=b=c=d=5;
等价于 var a=(b=(c=(d=5)));
,其中只有a被声明了,b,c和d都是自动解析为全局变量了。
7.setTimeout的延时会在后台被挂起,重新执行的时候作用域是window ,而不是内部函数.
8. 一个变量如果没有声明直接使用,会自动创建一个全局的变量,并且值为NaN。
9.图片与文字在同一行时显示不对齐,可以在图片上加上vertical-align: middle;
10.对象和数组是引用数据类型 → 这意味着这样的数据类型实际上并不保存值,而是存储指向存储单元的指针。
> let a = [1, 2, 3]
> let b = a
> b.push(8)
> b
[1, 2, 3, 8]
> a
[1, 2, 3, 8]
可以用Object.assign([],a)创建a的副本。
11.去除数组重复项
function opertion(arrs){
var arr = [];
for(var i = 0; i<arrs.length;i++){
if(arr.indexOf(arrs[i])){
arr.push(arrs[i]);
}
}
return arr;
}
去除数组中重复的对象:
12.sessionStorage:不在不同的浏览器窗口中共享,即使是同一个页面;localStorage:在所有同源窗口都是共享的;cookie:也是在所有同源窗口中共享的