ES5、ES6自学笔记( 六 )


this指向
① 以前在全局作用域函数中的 this 指向对象 。
② 严格模式下全局作用域中函数中的 this 是。
③ 以前构造函数是不加new也可以调用,当普通函数this 指向全局对象
④ 严格模式下,如果构造函数不加new调用, this 指向的是 如果给他赋值则 会报错
⑤ new 实例化的构造函数指向创建的对象实例 。
⑥ 定时器 this 还是指向。
⑦ 事件、对象还是指向调用者 。
>(function () {console.log(this);// 函数里的this指向window})();(function () {"use strict";console.log(this);// 严格模式下的this指向undefined})();
函数变化
① 函数不能有重名的参数 。
② 函数必须声明在顶层.新版本的会引入“块级作用域”( ES6 中已引入) 。为了与新版本接轨,不允许在非函数的代码块内声明函数 。非函数代码块:代码块就是if、for循环里面的执行体,也就是说只有再里面可以再次定义
"use strict";if (true) {function f() { } // !!! 语法错误f();}for (var i = 0; i < 5; i++) {function f2() { } // !!! 语法错误f2();}function baz() { // 合法function eit() { } // 同样合法}
更多严格模式要求参考:
高阶函数
>// 将函数作为参数function fun1(callback) {callback&&callback();// "fun1"}fun1(function () {console.log("fun1");})// 将函数作为返回值function fun2() {return function fun3() {console.log("fun3");}}fun2();
闭包
function fn1() { // fn1就是闭包函数var num = 10;function fn2() {console.log(num); // 10}fn2();}fn1();
在函数外部使用函数内的变量:
>// 我们fn 外面的作用域可以访问fn 内部的局部变量// 闭包的主要作用: 延伸了变量的作用范围function fn() {var num = 10;// function fun() {//console.log(num);// }// return fun;return function () {console.log(num);}}var f = fn();f();// 类似于// var f = function() {//console.log(num);//}// var f =function fun() {//console.log(num);//}
递归
// 递归函数:函数内部自己调用自己,这个函数就是递归函数var num = 1;function fn() {console.log('我要打印6句话');if (num == 6) {return; // 递归里面必须加退出条件}num++;fn();}fn();
浅拷贝和深拷贝 浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用.深拷贝拷贝多层, 每一级别的数据都会拷贝..(, …) es6 新增方法可以浅拷贝 浅拷贝
var obj = {id: 1,name: 'andy',msg: {age: 18}};var o = {};// 使用原生js进行浅拷贝for (const k in obj) {// k 是属性名 obj[k] 是属性值o[k] = obj[k];}// 因为obj.msg是对象,所以使用浅拷贝拷贝出来的是地址,改变o.msg也会导致obj.msg改变o.msg.age = 20;console.log(obj.msg.age);// 20console.log(o.msg.age);// 20// es6中的语法糖,使用Object.assign(拷贝,被拷贝)方法进行浅拷贝Object.assign(o, obj);
深拷贝
var obj = {id: 1,name: 'andy',msg: {age: 18},color: ['pink', 'red']};var o = {};// 使用递归深拷贝// 封装函数function deepCopy(newobj, oldobj) {for (const k in oldobj) {// 判断我们的属性值属于那种数据类型// 1.获取属性值 oldobj[k]var item = oldobj[k];// 2.判断这个值是否是数组(因为数组也是对象,所以要把数组放在上面)if (item instanceof Array) {newobj[k] = [];deepCopy(newobj[k], item);} else if (item instanceof Object) {// 3.判断这个值是否是对象newobj[k] = {};deepCopy(newobj[k], item);} else {// 4.属于简单数据类型newobj[k] = item;}}}deepCopy(o, obj);