js的函数

函数的声明

// 方式1
function fun(params) {
    console.log(params);
}
// 方式2
var fun1 = function (params) {
    console.log(params);
}

变量提升(非严格模式)

let 有暂时死区,不会被提升。

1. 变量
a =2
console.log(2);
// 等价于
var a
a = 2
console.log(a);
2. 变量是函数
a()
var a =function (params) {
    console.log('asd');
}
// Uncaught TypeError: a is not a function(因为a函数没有定义是个函数,只是定义a而已)
// 等价于
var a 
a = function a(params) {
    console.log('asd');
}
3. 函数声明高于一切,毕竟函数是js的第一公民。
a()
function a(params) {
    console.log('23');
}
var a= 2
// 23(返回的是函数)
4. 有多个函数声明的时候,是由最后面的函数声明来替代前面的。
fun()
function fun(params) {
    console.log('1');
}
function fun(params) {
    console.log('2');
}
//输出 2

This的指向

1. 默认绑定(只是函数声明方式不同而已)
function test() {
    console.log(this); //window 或 严格模式下是undefined
}
var fun = function (params) {
    console.log(this); //window 或 严格模式下是undefined
}
2. 隐式绑定(谁调用,指向谁)
// 例子1
const obj = {
    name: 'objName',
    getName() {
        console.log(this); //obj
        console.log(this.name); //objName
    }
};
obj.getName();
// 例子2(链式)
var foo =function (){
    console.log( this.a );
}
var obj1 = {
    a: 2,
   	obj2: obj2
};
var obj2 = {
    a: 3,
   	foo: foo
};
obj1.obj2.foo(); // 3
3. 显式绑定(apply,call,bind指定绑定的对象)
const bird = {
    name:'bird',
    fly(a='a',b='b'){
        console.log(this);
        console.log(this.name+' can fly');
        console.log(a+b+"0000000000000000");
    }
}
const fish = {
    name:'fish',
    Swimming(c='c',d='d'){
        console.log(this);
        console.log(this.name+' can Swimming');
        console.log(c+d+"111111111111111");
    }
}
bird.fly('aaaaaaaa','ssssssss')

mqmZkj.png

fish.Swimming('wwww','qweqewqe')

mqmmhn.png
将fish的Swimming的this指向bird
bind

//bind(要执行,参数是多个)
fish.Swimming.bind(bird,'1','qwe')()

mqmK10.png
call

// call(立即执行,参数是多个)
fish.Swimming.call(bird,'2',"33333333")

mqmJAJ.png
apply

// apply(立即执行,参数是一个数组存储)
fish.Swimming.apply(bird,['2','asd'])

mqmdc6.png

4. new绑定
function foo() {
    console.log(this);
}
foo(); //window
new foo(); //foo这个new出来的对象
5. 箭头函数绑定

this始终指向它被创建时所处的词法作用域中的this

// 例子1
const obj = {
    getName: () => {
        console.log(this); //调用前this是什么,函数里面的this就是什么
    }
};
obj.getName()//window
// 例子2
var b = {
    getThis: function () {
        return {
            fun: () => {
                console.log(this);
            }
        }
    }
}
b.getThis().fun()//返回{getThis:f}就是b对象
// 例子3
name = 'window'
var obj = {
    name: "obj",
    fn: function () {
        name = "obj1"
        console.log(this.name + "dddd");
        return {
            name: "obj2",
            fn1: function () {
                name = "obj3"
                console.log(this.name + "aaaaaaa");

                // return () => {
                //     console.log(this.name + "bbbbbbbbbb");
                // }
                return function () {
                    name = "obj4"
                    console.log(this.name + "bbbbbbbbbb");
                }

            },
            fn2: () => {
                console.log(this.name + "cccccccccccc");
            }
        }
    },
}

var newObj = obj.fn();
var newObj1 = newObj.fn1()
newObj1();
newObj.fn2();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值