函数声明会提升, 提升是整个函数体提升至当前作用域的顶层 函数表达式没提升

发布时间 2023-11-16 14:27:40作者: 龙陌

下列选项中,能正确调用和运行函数的是()

A
(function(){

console.log(1);

})

B
fun();

function fun(){console.log(1)}

C
fn();

var fn = function(){console.log(1);};

D
var fn = new Function(a,console.log(a));

fn(1);

正确答案:B

A选项不会自动调用函数,若要调用函数,应改为(function(){console.log(1);})();
B选项,普通函数由于存在函数提升,所以可以调用和执行函数;
C选项,fn是匿名函数,必须先声明后调用;
D选项,使用new Function()创建函数对象时,其参数必须为字符串形式。

函数表达式和函数声明以及它们提升的区别
函数声明会提升, 提升是整个函数体提升至当前作用域的顶层
函数表达式没提升, 提升是提升变量(函数的引用),表达式留在原地

A.立即执行函数没加()调用,相当于只是输入函数名,返回整个函数体
(function(){
console.log(1);
})

B.函数声明整体函数提升至最前面
fun();
function fun(){console.log(1)}

//提升后
function fun(){console.log(1)}
fun(); //正常执行fun(),输出1

C. 函数表达式是先提升变量,后在原来位置赋值

fn();
var fn = function(){console.log(1);};

//实际上
var fn //提升变量
fn() // fn is not a function
fn = function(){console.log(1)} //原来的位置

D. a未定义,记得Function得传字符串来着..
var fn = new Function(a,console.log(a));
fn(1);//ReferenceError: a is not defined