js函数预编译一遍过

js函数预编译

预编译是js的一个基础知识,也是如今面试的常见考点,今天我们来一次搞懂,不留遗憾。

函数预编译过程

我们将函数预编的过程分成以下四步进行理解。

  1. 创建一个AO对象 AO{}
  2. 找形参和变量声明 将变量和形参名作为AO对象的属性名 值为undefined
  3. 将实参和形参相统一
  4. 在函数体里面找函数声明 值赋予函数体

举个例子,我们先看看局部的预编译,观察以下代码,思考所有的console.log将打印什么值?

 1   function fn(a){
 2       console.log(a); 
 3      var a = 123;
 4       console.log(a);  
 5       function a(){};
 6       console.log(a);  
 7       console.log(b); 
 8       var b = function(){}
 9       console.log(b); 
 10       function c(){}
 11       console.log(c);      
 12   }
 13
 14   fn(1)

有没有感到一脸懵逼?

接下来,我们来分析一下上述代码的预编译过程,
注:为了方便小伙伴们看清楚预编译的四步,「」中的数字将表示上述代码所对应的行数。


// 第一步:创建一个AO对象 AO{}
AO{

	// 第二步:找形参和变量声明 将变量和形参名作为AO对象的属性名 值为`undefined`
	a:「形参1」「变量声明3undefined
	b:「变量声明8undefined
	
	// 第三步: 将实参和形参相统一
	a:「形参1」「变量声明3undefined 
	  「实参141
	b:「变量声明8undefined
	
	// 第四步:在函数体里面找函数声明 值赋予函数体
	a:「形参1」「变量声明3undefined
	  「实参141 
	  「函数声明5function a(){}
	b:「变量声明8undefined
	c:「函数声明10function c(){}
}

js为解释形语言,一行一行执行,我们来看一下执行的结果

 1   function fn(a){
 2       console.log(a); // function a(){}
 3       var a = 123;
 4       console.log(a); // 123
 5       function a(){}; // 不会产生代码执行
 6       console.log(a); // 123
 7       console.log(b); // undefined
 8       var b = function(){}
 9       console.log(b); // function(){}
 10       function c(){}
 11       console.log(c); // function c(){}      
 12   }
 13
 14   fn(1)

好了,搞懂了局部的函数预编译,接下来,我们看看全局的预编译。

全局的预编译

  1. 创建一个Go对象
  2. 找变量声明 将变量名作为GO对象的属性名 值为 undefined
  3. 在全局里面找函数声明 值赋予函数体
GO{
    test : undefined20function test(){}3」
    b:undefined

}
1	 console.log(test); // function test(){}
2    console.log(b); // undefined
3    function test(a){
4        // AO{
5        //     a:undefined, 234
6        //     c:undefined,
7        // }
8        console.log(c);  // undefined
9        var a = b = 345; // 全局里面把b重新赋值 b = 345
10        c = 9
11        if(false){		// 不进来
12            var c = 789 
13        }
14        console.log(a); // 345
15        console.log(c); // 9 
16    }
17    test(234)
18    console.log(b); // 345
19       console.log(test); // function test(){}   
20    var test = 123
21    var b = 456
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,使用`compile()`函数进行预编译可以生成一个`Pattern`对象。`Pattern`对象是一个正则表达式模式的编译形式,可以重复使用,避免每次使用正则表达式时都需要重新编译。`Pattern`对象可以使用`match()`、`search()`、`findall()`等方法进行匹配操作。 下面是一个例子,演示如何使用`compile()`函数进行预编译: ```python import re pattern = re.compile(r'\w+') text1 = 'Hello, world!' text2 = 'Python is awesome!' match1 = pattern.findall(text1) match2 = pattern.findall(text2) print(match1) # ['Hello', 'world'] print(match2) # ['Python', 'is', 'awesome'] ``` 在这个例子中,我们使用`compile()`函数预编译了一个正则表达式模式`r'\w+'`,它可以匹配一个或多个字母、数字或下划线。然后,我们使用这个预编译后的正则表达式模式对两个字符串进行了匹配操作。由于我们使用了预编译后的模式,因此不需要每次都重新编译,可以提高匹配效率。最后,我们打印出匹配结果。 需要注意的是,`compile()`函数的第一个参数是一个正则表达式字符串,第二个参数是可选的标志参数,用于指定正则表达式的匹配模式。如果没有指定标志参数,默认是`0`,表示使用普通的匹配模式。另外,需要注意的是,`compile()`函数返回的是一个`Pattern`对象,而不是一个字符串或匹配对象。如果需要进行匹配操作,需要使用`Pattern`对象的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值