技巧
1,理解webpack的加载器,调用器
2,对this的作用域机制和对象有清晰理解,知道任何情况下this指的什么对象。
3,对new和Function有较为深入的理解,清晰new和Function的初始化机制,默认做了什么动作。
js实现自己的new
关键字new在调用构造函数的时候其实执行了一下几个步骤:
1.创建对象
2.修改此对象的原型,让指向其传入的构造函数的原型对象
3.指向构造函数中的代码(为这个对象添加属性)
4.返回新对象
知道原理,手动实现一个new
function New(fn,...args){
// 创建一个对象,其对象的原型,指向构造函数的原型对象
let obj =Object.create(fn.prototype)
// 指向构造函数中的代码,并修改this,指向obj
let result= fn.apply(obj,args)
// 构造函数本身如果返回的是对象的话,则 返回的就是此对象
// 如果返回值不是对象的话,则 返回对应的obj
return result instanceof Object ? result:obj
}
function A(a,b){
this.a=a
this.b=b
}
const d =New(A,1,2)
console.log(d.a); //1
console.log(d.b); //2
注意: new 构造函数, 如果此构造函数 有返回值,且返回值是对象的话,则就返回此对象本身。
所以最后判断一下,返回值是不是对象,如果不是,则返回obj
JavaScript 中 call()、apply()、bind() 的用法
参考:
https://www.runoob.com/w3cnote/js-call-apply-bind.html
https://www.cnblogs.com/Shd-Study/p/6560808.html
JavaScript 中 arguments
JavaScript中的new
js引用类型之Function类型-new Function()
定义:引用类型是一种数据结构,用于将数据和功能组织在一起,引用类型有时候也被称为对象定义
第一种方式
//对于创建一个字符串的函数
var test = new Function('arg','console.log(arg+1)');
test(2) ; //3
//其等价于
var test = function(arg) {
console.log(arg + 1);
}
test(2); // 3
第二种方式
var test = new Function(arg,'console.log(arg+1)');
var arg = 2;
test();//3
第三种方式
我们甚至不需要显式地传参数给这个函数。我们使用apply方法来调用它。它会自动设定函数执行的上下文。这就是为什么我们能在函数里面使用this.arg。这里this指向data对象。
var data = {arg:2}
var test = new Function('console.log(this.age+1)').apply(data); //3
理解下面代码-new(function(){})
n = new(function(){
console.log(123,this,arguments);
return function(){
console.log(456,this,arguments);
}
})
n //ƒ (){console.log(456,this,arguments);}
n({setime: 789})
n = new(function(){
console.log(123,this,arguments);
return 111
})
n //{}
n = new(function(){
console.log(123,this,arguments);
return {'aaa':'111'}
})
n //{aaa: '111'}
new会执行括号里面定义的函数并返回一个对象或函数
!function
!function
是一种常见的 JavaScript 语法,用于创建立即执行函数表达式(Immediately Invoked Function Expression,IIFE)并对其结果进行逻辑非(logical NOT)运算。
IIFE 是一个用于创建匿名函数并立即执行的常用模式。它具有以下形式:
(function() {
// 函数体内的代码
console.log("IIFE executed");
})();
在这个模式中,函数被包裹在括号中,并紧接着的括号对立即调用该函数。这样做的目的是为了创建一个函数作用域,并立即执行其中的代码。这有助于避免变量泄露到全局作用域,同时可以创建私有变量和函数。
而在 !function
的语法中,!
是逻辑非运算符,用于将表达式的结果转换为布尔值的相反值。在这种情况下,我们使用逻辑非运算符 !
对匿名函数进行逻辑非运算,将其结果转换为布尔值。
以下是一个示例,演示如何使用 !function
创建一个立即执行函数表达式并对其结果进行逻辑非运算:
!function() {
console.log("IIFE executed");
}();
在这个示例中,我们创建了一个匿名函数并立即执行它。匿名函数被包裹在 !
运算符中,并通过 ()
进行立即调用。当这段代码执行时,匿名函数内的代码将被执行,并在控制台中输出 “IIFE executed”。
逻辑非运算符 !
将函数的执行结果转换为布尔值的相反值。在这个示例中,由于逻辑非运算符的作用,函数的执行结果将被转换为 false
的布尔值。