分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

js中匿名函数

发布时间:2023-09-06 01:07责任编辑:董明明关键词:js匿名函数

今天碰到一道题,里面既包含了匿名函数的知识,也包含了预编译,函数的传参(形参),感觉迷迷糊糊的,所以想着做个总结。

 var foo={n:1}; ????(function(foo){ ??????console.log(foo.n); ??????foo.n=3; ??????var foo={n:2}; ??????console.log(foo.n); ????})(foo); ????console.log(foo.n);

上面的代码,可以写成这样,看解释

1 var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????foo.n=3; ????????????//形参和实参的指向的内存空间发生了改变,值现在变为36 ???????var foo={n:2}; ??????//这行很关键,开辟了新的内存空间,n的值为27 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出28 ?????})(foo);9 ?????console.log(foo.n); ???//之前的内存空间值为3,所以输出3
结果输出 ?1 ?2 ?3

按照上面的思路,如果第五行和第六行换一下呢

1 var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????var foo={n:2}; ?????//这行很关键,开辟了新的内存空间和之前的已经断开联系,n的值为26 ???????foo.n=3; ????????????//改变了新的内存空间里面的值,值现在变为37 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出38 ?????})(foo);9 ?????console.log(foo.n); ???//之前的内存空间值为1,所以输出1
结果输出 1 ?3 ?1

ok   那接下来这个呢

1 ?var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????foo.n=3; ????????????//形参和实参的指向的内存空间发生了改变,值现在变为36 ???????foo.n=2 ?????????????//并没有开辟了新的内存空间,在原来的基础上修改的,n的值为27 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出28 ?????})(foo);9 ?????console.log(foo.n); ???//原始的的内存空间值经过修改变为2,所以输出2
结果输出 ?1 ?2 ?2

下面和上面一样了

1 var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????foo.n=2; ????????????//形参和实参的指向的内存空间发生了改变,值现在变为26 ???????foo.n=3; ?????????????//并没有开辟了新的内存空间,在原来的基础上修改的,n的值为37 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出38 ?????})(foo);9 ?????console.log(foo.n); ???//原始的内存空间的值经过修改变为3,所以输出3
结果输出 1 ?3 ?3

那下面这个呢(第五行和第六行都改变了指向,由于并不是在原来的基础上修改的,所以最后输入的值不变)

1 ???var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????var foo={n:2}; ????????????//开辟了新的内存空间,n的值为26 ???????var foo={n:3}; ?????????//开辟了新的内存空间,n的值为37 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出38 ?????})(foo);9 ?????console.log(foo.n); ???//原始的内存空间的值为1,并没被有被修改,所以输出1
结果输出 1 ?3 ??1

这个就和上面的一样了

1 ???var foo={n:1};2 ?????(function(foo){ ???????//此时形参和实参指向相同的内存空间,且空间的值n为13 ???????var foo; ????????????//变量的提升,一个变量的声明优先级低于形参,so这行相当于无效4 ???????console.log(foo.n); ?//这里应当输出15 ???????var foo={n:3}; ???????????//开辟了新的内存空间,n的值为36 ???????var foo={n:2}; ?????????//开辟了新的内存空间,n的值为27 ???????console.log(foo.n); ?//由于js中的代码是自上而下执行,所以此时输出28 ?????})(foo);9 ?????console.log(foo.n); ???//原始的内存空间并未被修改,所以输出1
结果输出 1 ?2 ?1

以上为小弟解读,如果过错还请大神指教。

js中匿名函数

原文地址:http://www.cnblogs.com/yyfyl/p/7455241.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved