JavaScript高级学习笔记 day03

1.函数的定义及调用

  1. 自定义函数(命名函数),this => window
    function fn(){};
    fn();
    fn.call();
  2. 函数表达式(匿名函数),
    var fn = function(){};
    fn();
  3. 利用new Function
    var fn = new Function(‘a’,‘b’,‘console.log(a+b)’);
    fn(1,2)
  4. 对象的方法,this => 对象o
    var o = {say:function(){}};
    o.say();
  5. 构造函数,this => star实例对象
    function Star(){};
    var star = new Star()
  6. 绑定事件函数,this => 调用者
    btn.onclick = function(){};
  7. 定时器函数,this => window
    setInterval(function(){},1000)
  8. 立即执行函数,this => window
    (function(){})();

2.改变函数内部的this指向

  1. call()方法:可以调用函数,可以改变this指向;主要作用是实现继承
  2. apply)()方法:可以调用函数,也可以改变this指向,但是它的参数必须是数组,输出的是字符串;主要作用是给数组添加方法
  3. bind()方法:不会调用函数,只能改变this指向,返回的是原函数改变this之后产生的新函数,需要调用新函数;主要作用是有的函数不需要立即调用,但又要改变this指向,比如定时器

3.严格模式

  • 严格模式:消除了语法的不合理,消除代码运行的不安全,禁用未来版本的一些语法
    1. 为整个脚本(script标签)开启严格模式, ‘use strict’,写在所有js代码之前
    2. 为某个函数开启严格模式,‘use strict’,写在函数内部,其他代码之前

3.1严格模式中的变化

  1. 变量必须先声明再使用
  2. 不能随意删除已经声明好的变量
  3. 严格模式下全局作用域中函数的 this 是 undefined
  4. 严格模式下,如果构造函数不加 new 调用,this 会报错
  5. 定时器 this 指向还是window
  6. 严格模式下,不能有重名的参数

4.高阶函数

  • 高阶函数:接收函数作为参数或将函数作为返回值输出

4.1闭包

  • 闭包:有权访问另一个函数作用域中变量的函数
  • 作用:延伸了变量的作用范围
function(){
	var num = Math.random()//局部变量num一直在
	function fun(){
		return num;
	};
	return fun
};
var res = fn();//res现在是函数fun()
var res1 = res();
var res2 = res();//res1和res2输出的永远是同一个num
  • 闭包应用:定时器
//闭包应用,3秒钟之后打印所有li元素的内容
        var lis = document.querySelectorAll('li')
        for(var i = 0; i < lis.length; i++){
            (function(i){
                setTimeout(function(){
                    console.log(lis[i].innerHTML);
                },3000)
            })(i)
        }

4.2递归

  • 函数内部自己调用自己,这个函数就是递归函数
  • 递归里面必须加退出条件
	//比如求阶乘
		function fn(n){
            if(n == 1){
                return 1;
            }
            return n * fn(n - 1);
        }
        console.log(fn(3));
  • 递归应用:遍历数组
var data = [{
            id:1,
            name:'家电',
            goods:[{
                id:11,
                name:'冰箱'
            },{
                id:12,
                name:'洗衣机'
            }]
        },{
            id:2,
            name:'服饰'
        }]
        //输入id号,就可以返回数据对象
        //1、利用forEach遍历每一个对象
        function getID(json,id){
            var obj = {};
            json.forEach(function(item){
                if(item.id == id){
                    obj = item;
                    //2、利用递归得到里层数据
                }else if(item.goods && item.goods.length > 0){
                    obj = getID(item.goods,id);
                };
            });
            return obj;
        };
        console.log(getID(data,1));
        console.log(getID(data,11));
        console.log(getID(data,12));

5.浅拷贝与深拷贝

  1. 浅拷贝:只拷贝一层,更深层次对象级别的只拷贝引用。新对象和原对象指向同一个地址,修改值,两个对象相互影响
  2. 深拷贝:拷贝多层,每一级别的数据都会拷贝。新对象和原对象指向不同的地址,修改值,两个对象互不影响。需要用递归判断拷贝的值属于哪种数据类型
  3. es6中新增的浅拷贝方法:Object.assign(new,old)
上一篇:day03:学习总结


下一篇:day03