为了保证可读性,本文采用意译代替直译。
如果你想看更多高质量的文章,请戳GitHub博客,每年都有上百篇高质量的文章等着你!
1.这其中的奥秘
很多时候,JS中的这一点对于我们的初学者来说非常困惑。这是非常强大的,但需要一些努力才能慢慢理解。
对于Java、PHP或其他标准语言,这表示类方法中当前对象的一个实例。在大多数情况下,这不能在方法之外使用,因此不太容易混淆。
在j市,情况就不同了。这表示函数的当前执行上下文,在JS中调用函数有几种方法:
该函数调用:报警(' Hello World!')方法调用: console.log('Hello World!')构造函数3360new regexp (' d ')隐式调用:alert.call(未定义,“hello world!”每种调用类型都以自己的方式定义上下文,所以很容易混淆。
此外,严格模式也会影响执行上下文。
理解这一点的关键是清楚地知道函数调用以及它如何影响上下文。
本文主要解释了函数是如何被调用的,以及它是如何影响函数的,并解释了执行上下文的常见陷阱。
开始之前,请了解几个术语:
调用函数是执行代码来创建函数体,或者只是调用函数。例如,parsent函数调用是parsent(' 15 ')。
函数调用:执行构成函数主体的代码:例如,parsent函数调用是parsent(' 15 ')。调用上下文:指这个在函数体中的值。例如,map.set的调用上下文(“键”、“值”)是map。函数范围:它是函数体中可访问的变量、对象和函数的集合。2.函数调用
当表达式是一个后跟一个的函数(一些参数用逗号和一分隔)时,会执行一个函数调用,例如parsent(' 18 ')。
函数调用表达式不能是属性调用,例如obj.myFunc(),它用于创建方法调用。再比如[1,5]。join(',')不是函数调用,而是方法调用。记住这一区别很重要。
函数调用的一个简单例子:
函数hello(name) {返回' Hello ' name '!';}//函数调用const message=hello(' World ');console.log(消息);//='你好,世界!'Hello('World ')是一个函数调用。 hello表达式相当于一个函数,后面跟一对括号和‘World’参数。
一个更高级的例子是IIFE(立即称为函数表达式)
const message=(函数(名称){返回' Hello ' name '!';})(“世界”);console.log(消息)//='Hello World!'IIFE也是一个函数调用:第一对括号(函数(名称){ 0.})是一个表达式,它的计算结果是一个函数对象,后面跟一对圆括号。括号的参数是“世界”。
2.1.这在函数调用中
这是函数调用中的全局对象。本地对象由执行环境决定。在浏览器中,这是一个窗口对象。
在函数调用中,执行上下文是一个全局对象。
让我们看看以下函数中的上下文是什么:
函数sum(a,b){ console . log(this===window);//=true this . mynumber=20;//将‘myNumber’属性添加到全局对象返回a b;}//sum()作为函数调用//这个' in sum()是一个全局对象(window)sum(15,16);//=31 window . mynumber;//=20当调用sum(15,16)时,JS自动将其设置为全局对象,在浏览器中为window。
当在任何函数范围(顶级范围:全局执行上下文)之外使用时,这表示一个窗口对象
console.log(此===窗口);//=true this . MyString=' Hello World!';console . log(window . MyString);//='你好,世界!'!在一个html文件中