一些概念性问题

1、

全局虽然无法直接访问局部变量,但局部变量是可以向上访问它的父级的变量

如果有两个同名全局变量,后执行的那个会覆盖前者,

全局变量不可以被删除,但是隐式全局变量可以被删除

需要注意一下for循环中全局与局部变量

块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用。对于js整体而言没有块级作用域只存在全局和局部。(es6中新增块级作用域变量let,但是let声明的变量只在let命令所在代码块内有效)

2、

querySelector只返回匹配的第一个元素,如果没有匹配项,返回null。 

querySelectorAll返回匹配的元素集合也就是一个数组,如果没有匹配项,返回空的nodelist(节点数组)。 

返回的结果是静态的,之后对document结构的改变不会影响到之前取到的结果。 

这两个方法都可以接受三种类型的参数:id(#),class(.),标签,很像jquery的选择器。

如果使用querySelector对多个选择器样式进行内容或样式的更改,依据这些选择器在<body>中的位置(只对位置为第1的元素进行修改,与在querySelector中写入的位置无关)进行内容或样式修改

3、

es6中三个点运算符(...)可能是扩展运算符或者是rest运算符

扩展运算符:把数组或类数组对象展开成一系列用逗号隔开的值

var foo = function(a, b, c) {
    console.log(a);
    console.log(b);
    console.log(c);
}

var arr = [1, 2, 3];

//传统写法
foo(arr[0], arr[1], arr[2]);
//1
//2
//3


//使用扩展运算符
foo(...arr);
//1
//2
//3

rest运算符:把逗号隔开的值序列组合成一个数组

//主要用于不定参数,所以ES6开始可以不再使用arguments对象
var bar = function(...args) {
    for (let el of args) {
        console.log(el);
    }
}

bar(1, 2, 3, 4);
//1
//2
//3
//4

bar = function(a, ...args) {
    console.log(a);
    console.log(args);
}

bar(1, 2, 3, 4);
//1
//[ 2, 3, 4 ]

es6中解构:

var arr = ['this is a string', 2, 3];

//传统方式
var a = arr[0],
    b = arr[1],
    c = arr[2];

//解构赋值
var [a, b, c] = arr;

console.log(a);//this is a string
console.log(b);//2
console.log(c);//3

4、

function.apply()方法和function.call()方法

function.apply(obj,args):只存放两个参数,第一个参数obj替代this,第二个参数arguments将参数列表直接当做一个数组=args传给函数,但是参数列表中的参数位置要保持一致,apply也可以将一个数组默认的转换为一个参数列表([param1,param2,param3] 转换为 param1,param2,param3) 

Math.max.apply(null,Array)/Math.min.apply(null,Array):因为Math.max /Math.min参数里面不支持Math.max([param1,param2])/ Math.min([param1,param2])也就是数组但是支持Math.max(param1,param2,param3…)/Math.min(param1,param2,param3…),因此可以使用Math.max.apply(null,Array)/Math.min.apply(null,Array)获取传递过来的参数中的最大值或者最小值,这里的第一个参数因为不需要this放什么就无所谓了但是随便放又需要是定义过的所以放了null更省事些也可以放undefined避免不必要的空间浪费。

function.call(obj,[param1[,param2[,…[,paramN]]]]):第一个参数obj替代this,后面直接将参数列表写在里面

function Person(name,age)  
    {  
        this.name=name;  
        this.age=age;  
    }  
    /*定义一个学生类*/  
    functionStudent(name,age,grade)  
    {  
        Person.apply(this,arguments);  
        this.grade=grade;  
    }  
    //创建一个学生类  
    var student=new Student("zhangsan",21,"一年级");  
    //测试  
    alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);  
    //name:zhangsan 
    //age:21  
    //grade:一年级  



function Person(name,age)  
    {  
        this.name=name;  
        this.age=age;  
    }  
    /*定义一个学生类*/  
    functionStudent(name,age,grade)  
    {  
        Person.call(this,name,age);  
        this.grade=grade;  
    }  
    //创建一个学生类  
    var student=new Student("zhangsan",21,"一年级");  
    //测试  
    alert("name:"+student.name+"\n"+"age:"+student.age+"\n"+"grade:"+student.grade);  
    //name:zhangsan 
    //age:21 
    //grade:一年级  
/
在给对象参数的情况下,如果参数的形式是数组的时候,比如apply示例里面传递了参数arguments,这个参数是数组类型,并且在调用Person的时候参数的列表是对应一致的(也就是Person和Student的参数列表前两位是一致的) 就可以采用 apply , 如果我的Person的参数列表是这样的(age,name),而Student的参数列表是(name,age,grade),这样就可以用call来实现了,也就是直接指定参数列表对应值的位置(Person.call(this,age,name,grade));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值