javascript中的函数返回值(return)

有些情况,我们希望获取到函数的执行结果,也就是我们需要在函数以外的地方处理执行结果,而不是在函数内部处理。这时我们就需要为函数设一个返回值,也就是return,即函数执行完毕以后返回的结果。

  • 若在函数中不指定返回值,则会默认返回undefined;
  • 若仅仅写一个return,则也会返回undefined,且会终止程序;
  • 当return 返回是false时,也将会中断操作;
  • return 语句表示从当前函数退出,并从那个函数返回一个值;return后可以跟任意类型的数据,可以是基本数据类型,也可以是对象,甚至是函数;

视频链接:https://www.bilibili.com/video/BV1eh411i7Uw?spm_id_from=333.788.top_right_bar_window_custom_collection.content.click

什么是闭包? 闭包的功能? 如下图:
老师回复:在js中,对象是引用传递的。而闭包是把子函数的引用,传递到父函数之外,去访问。
Screenshot_20220115_220534.jpg

  1. 闭包:
  2. 闭包的条件:
  3. - 函数嵌套函数
  4. - 内部函数使用外部函数的变量
  5. - 调用外部函数
  6. 闭包到底是什么:
  7. - 通俗的理解:函数嵌套函数,内部函数就是闭包
  8. - 浏览器查看后理解:内部函数的Scopes中,包含引用外部函数变量的一个对象
  9. 闭包的作用:
  10. - 延长了局部变量的生命周期
  11. - 在外部控制局部变量
  12. 闭包的缺点:
  13. - 局部变量会长期驻留在内存中,可能会造成内存泄漏(IE9以下)
  14. 解决闭包带来的缺点:
  15. - 减少使用闭包
  16. - 及时释放

内部函数没有执行完成,外部函数的变量不会被垃圾回收。
闭包的应用:可以封装一段代码,把想要封装的函数写上return,让其作为父函数的返回值,然后在把变量放在父函数里,需要使用所封装的代码时,直接在外部将父函数给到一个变量,然后使用这个变量,即调用了return,从而既能达到业务需求,又能减少全局变量节省内存空间。
定义了私有变量不让别人访问,只能访问return暴露出去的函数,从而使用私有变量。

eg1:

  1. function outerFun(){
  2. let a = 10; //使用局部变量,减少全局变量
  3. function innerFun(){
  4. console.log(a);
  5. };
  6. return innerFun; //封装了代码,实现模块化
  7. };
  8. let fun = outerFun(); //让return等于fun
  9. fun(); //外部调用,实现模块化

eg2:

  1. let xz = (function(){
  2. let a = 10;
  3. let b = 20;
  4. function add(){
  5. return a + b;
  6. };
  7. function sub(){
  8. return a - b;
  9. };
  10. return {
  11. add,
  12. sub
  13. }
  14. })(); //匿名函数自调用 也是,立即执行函数
  15. let result1 = xz.add();
  16. let result2 = xz.sub();
  17. console.log(result1);
  18. console.log(result2);
  19. console.log(a); //输出undefined 或者 报错,因为a没有对外暴露,只对外暴露了return

针对下图,有几个自己搞错的点总结一下:

  1. let _f1 = fn1();

    1. 这一句代码,是将函数fn1的返回值,也就是return后面的两行代码赋值给了_f1 而不是把整个函数给了_f1,因为在上面函数fn1声明的时候已经带了functionName,这是两种函数定义方法的其中一种。 functionName()赋值给某个变量,是其返回值的赋值。
  2. 上一句代码的赋值操作,实际上是将return后面的两句代码直接替换到下面的fn1(), 即:

    let _f1 = function(){
    console.log(n)
    };
    由此可见,这行赋值操作,是将_f1变做了一个函数,而 下一行代码:_f1();的执行,则是window调用其运行,再由作用域链,由内而外寻找到变量n,实现了打印n。 由此就实现了,在外部访问到了函数内部的值,return子函数就是闭包。
    Screenshot_20220115_211926.jpg

下图输出的是我是老尚。
有几个点需要说一下:

  1. _obj.getData()() 是两个括号,第一个括号是执行,第二个括号返回的是第一个return。 ?是吗?

Screenshot_20220115_221545.jpg

上图相当于下图替换为第二个:
因为上下文看的是调用的位置,所以this是window,str是window里的str。
Screenshot_20220115_221540.jpgScreenshot_20220115_221617.jpg