求大神解释js中立即执行函数的问题

2020-11-23 06:38:06 字数 4481 阅读 4297

1楼:匿名用户

vara=0;

function()

console.log(a);

//匿名函数要么立即执行,要么作为**,不能直接定义一个匿名函数,把上面的function改成下面两种都没问题。

functionsomename();

varsomename=function();

//立即执行匿名函数就像第一个例子那样,先定义,然后用括号括起来,表示立即执行,最后的一对括号用来传递参数

(function())();

为什么要有js立即执行函数,存在的意义是什么

2楼:梁氏子

我了解到的是:立即执行函数可以避免函数内的变量暴露在全局环境下,避免全局变量的污染。

这种模式是非常有用的,因为它为你初始化**提供了一个作用域的沙箱;

考虑一下下面这种常见的场景:

你的**在页面**加载完成之后,不得不执行一些设置工作,比如附加时间处理器,创建对象等等,

所有的这些工作只需要执行一次,所以没有理由创建一个可复用的命名的函数,

但这些**也需要一些临时的变量,但初始化过程结束后,就再也不会被用到了,

所以将这些变量作为全局变量不是个好主意,所以我们需要立即执行函数——去将我们所有的**包裹在它的局部作用域中,不会让任何变量泄露成全局变量;

js立即执行函数,作用域问题

3楼:匿名用户

js分为全局作用域和函数作用域,全局作用域在函数内部可以访问到,但是函数内部的变量,外部无法访问到

var name = 'zhangsan';

(function())()

console.log(name)//函数的作用域,在全局中无法访问,这里结果是张三

var name = 'zhangsan';

(function())()

console.log(name)//lisi

4楼:枝寰溥蔓

数组索引要为整形

即xx[key]

中的key必须是整形的,你传的‘v’+i

是不对的,应该这样写:

(function()

alert("xx.length="

+xx.length);

//???

此处的xx.length为何等于0

return

xx;};

xx2=

function(xx,

key,

value)

;varb=

a();

alert(b);

//显示的b为何为空?

})();

javascript立即执行函数什么用

5楼:匿名用户

建立一个函数作用域

相关局部变量和参数只在函数内有效

是非常有用的小方法

6楼:一颗俗不可耐

什么叫立即执行函数.

在js中function()是什么意思?一般是什么情况下用?新手求大神详细解释谢谢!

7楼:烟花梦帘

function()是js函数,类似于java中的方法,c中的函数

按钮以上的含义就是在点击这个按钮的时候,执行formsubmit()这个函数,完成一个窗口的弹出,内容是你好

js**为什么不执行,求大神解释

8楼:匿名用户

javascript弱类型的,你都给加上string ***, string sign,将修饰符去掉试试。

楼主敲**时,注意方法的大小写错误,还有就是不要把标签给看串行了 慢慢来,写多了就好了.

求大神们指教一个js用法: 写一个js函数: function executefunction(functionname) { }

9楼:蓝风紫电

^function executefunction(functionname) catch(e){}}

10楼:匿名用户

就直接使用就是了,还要怎么调用?

js中函数执行完毕为什么会被销毁?? 10

11楼:育知同创教育

关于js中作用域的销毁和不销毁的情况总结

window全局作用域->页面关掉才销毁

函数执行会形成私有的作用域

1)作用域的销毁

一般情况下,函数执行形成一个私有的作用域,当执行完成后就销毁了->节省内存空间

2)作用域的不立即销毁

function fn()

}fn()(15);//->先执行fn,有一个私有的变量i=10,返回一个堆内存地址 ***fff111,我们发现这个地址还用到了一次,那么当前的这个fn形成私有作用域(a)就不能立即销毁了,***fff111(15)->输出25,a中的i变为11;当***fff111执行完了,发现这个地址没用了,浏览器就把a、***fff111都释放了

fn()(20);//->在执行fn的时候一切都从新开始了,和上面的步骤是一样的->输出30

3)作用域的不销毁:形成一个私有作用域,里面的内容被外面占用了

function fn()

}var f=fn();//->fn执行形成一个私有的作用域a,a中有一个私有的变量i=10,a中返回一个地址***fff11,被外面的f占用了,那么当前的a就不能销毁了

f(15);//->输出25,让a中的i=11

f(20);//->输出31,让a中的i=12

...当我们知道f用完的时候,为了优化性能,我们让f=null,这样的话a中的***fff111没人占用了,浏览器会把a和***fff111都释放了

几种不销毁常用到的形式:

1)函数执行,返回一个引用数据类型的值,并且在函数的外面被别人接收了,那么当前函数形成的私有作用域就不在销毁了-->例如上面的案例

2)在函数执行的时候,里面的一个小函数的地址赋值给了我们的外面元素的点击事件,那么当前小函数也相当于被外面占用了,大函数执行形成的私有的作用域也不销毁了

//每一次循环都执行自执行函数形成一个私有的作用域(循环三次就有三个作用域,每一个作用域中都有一个i,第一个存储的是0,第二个存数的是1..),在每一个私有的作用域中都把里面的函数绑定给了外面元素的点击事件,这样的话每一次形成的作用域都不销毁了(三个不销毁的作用域)

var olis=document.getelementsbytagname("li");

for(var i=0;i

//window.settimeout(move,10); ->第二次执行move的时候我们没有给它传值(这样写不行)

window.settimeout(function(),10);//->这样写实现了,但是每一次执行定时器都会形成一个私有的所用域(匿名函数形成的)a,在a中使用了上级作用域中的tar的值,而且执行了move又形成了一个小的作用域(而在小的作用域中会使用tar的值),这样每一次定时器形成的a都不能销毁了

}move(100);//->第一次这样执行传递100

//解决办法:

function move(tar)();

}move(100);//->第一次这样执行传递100

js中内存空间释放的问题(堆内存、栈内存)

[谷歌浏览器]

我们开辟一个内存,可能或有一些其他的变量等占用了这个内存,谷歌浏览器都会间隔一段时间看这个内存还有没有被占用,如果发现有没有被占用的内存了,就自己帮我们**了(内存释放)

[火狐和ie]

我们开个内存,当我们引用了它,就在内存中记录一个数,增加一个引用浏览器就把这个数+1,减少一个引用,浏览器就把这个数-1...当减到零的时候浏览器就把这个内存释放了;但是有些情况下(尤其是ie)记着记着就弄乱了,内存就不能释放了-->浏览器的内存泄露

var obj={};

我们养成一个好的习惯,当我们obj这个对象使用完成了,我们手动的obj=null (null空对象指针),浏览器会自己把刚才的堆内存释放掉

求大神帮忙解释一下这段js**的问题

12楼:阿波罗的同行者

用点的时候,后面跟的是字符常量类型的值;

用[attr]指的是attr变量里面的值,如果用["attr"],那也是一个常量;

根据你的**看,attr是一个变量,所以只能用

13楼:匿名用户

obj.style[attr]

里面的attr例如是:width

就等同于obj.style["width"]而obj.style.attr

意思是style的attr属性,可是并没有attr属性,有的是width属性

应该是obj.style.width

attr只不过是变量而已,变化的量