笔记(二)

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.

以下代码输出结果为

 
  1. var a= 2018<0 || typeof(2018+"");

  2. 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:也是在所有同源窗口中共享的

闭包解释参考博文:https://www.jianshu.com/p/0f8276bf7f49

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值