为何说这个参数不是一个函数(Uncaught TypeError)?

为何说fn不是一个函数?
image.png

function f1(fn){
    var a = 1;
    return fn();
}
function f2(){console.log(a+1)}
var s = f1();
s(f2());

按照一楼网友的提示:
image.png
结果又报错,我只是想体验下能否在外面定义一个函数,加入到另外一个函数中形成闭包?难道这样不行嘛?

阅读 1.3k
3 个回答

f1f2 的定义代码没有问题, 但是你在调用的时候不是没传参吗?

var s = f1();

程序找不到无参 f1() 的定义, 肯定报错案
给个参数就好了 例如 var s = f1(function() {});

闭包是这样?

我在函数内定义了a, 再返回出去
我在外边通过调用这个fun函数来获取到a?

function fun(){
    const a = 1;
    return a;
}

console.log(fun()); // 1

同理按照你之前的代码, 是应该改成这样子是吗?

function f1(fn) {
    var a = 1;
    return a;
}

function f2() {
    console.log(f1() + 1)
}

f2() // 2

不知道你是想达到哪种效果,如果只是想形成闭包的话,简单来说只要函数内部作用域的变量或函数被外部引用就算形成闭包了。
在你的代码里,fn就是f1的一个内部函数,只要外面存在对这个函数的引用就是形成闭包了,比如var s = f1();改成var s = f2; f1(f2); s();这样就形成闭包了,f1(f2)执行完毕它的作用域也不能被销毁,因为外部还存在f2的引用,等s()执行完毕才能销毁f1的作用域。

第一部分的 fn is not a function 是由于你在执行 var s = f1() 的时候没有传入 fn 这个值,所以在实际执行的时候其实最后是这样的 return undefined() 所以肯定会报错。

第二部分,你改写之后控制台提示 a is not defined,是因为你在 f1 里面直接执行了 f2,而 f2 的定义在外部,所以他会去找 f2 函数定义是申明的变量 a 显然没有,然后就回去找全局的变量 a 显然也没有,所以就会在控制太输出 a is not defined

你最后提出来的问题,我在你的另外一个问题里面回答了,可以去 javascript - 两个独立的函数,能形成闭包函数嘛? 这个问题里面去查看。

推荐问题
宣传栏