初学JS有一些困惑,在JS中,把一个函数作为一个参数传递给另外一个函数,这个时候为避免大量内存操作,使用的是地址传递。为什么我在打印这个参数的时候是函数体,而不是一个地址值呢?如果是函数体的话,为什么不先进行函数的参数运算,然后再进行函数运算。<html>
<head>
<script lang="javascript">
function say()
{
alert("a");
}
function exe(f)
{
alert(f);
f();
}
window.onload=exe(say);
</script>
</head>
<body></body>
</html>
为什么alert(f);不是一个地址值,而是一个函数体?为什么优先运行alert(“a”)?
<head>
<script lang="javascript">
function say()
{
alert("a");
}
function exe(f)
{
alert(f);
f();
}
window.onload=exe(say);
</script>
</head>
<body></body>
</html>
为什么alert(f);不是一个地址值,而是一个函数体?为什么优先运行alert(“a”)?
解决方案 »
- Jquery-GridTable问题,讨教.谢谢.
- 请教一个JS的事件问题
- eval问题,搞不明白。
- 改变字体颜色的问题
- 请教高手:iframe有没有location对象?本人在js里设置location.reload(true)时,client老实报object is null or is not object
- 怎么用JavaScript取和设置Struts中<html:text property="tt" value="ddddd">的value值
- 第二个页面中的FORM怎么传值给第一个页面的隐藏控件?不用SUBMIT
- 无须高手,知道就行,马上给分!Netscape&IE
- 再问个菜鸟问题,showmodaldialog的title怎样控制
- 手机端怎么让视频作为背景自动循环播放?
- 急急急急急急急急急急!!!动态插入table问题
- js ascll码转为字符串
为什么我在打印这个参数的时候是函数体,而不是一个地址值呢?//可能的 alert的实现代码是这样的
function alert(a){
System.Dialog.show((*a).toString());
}a就算是地址 但是 alert打印的就是 传入的对象 的 toString方法 的返回值
在高级别的语言种 在代码层面是不会给开发者操作内存地址的 而且我们也不需要
如果是函数体的话,为什么不先进行函数的参数运算,然后再进行函数运算。
函数是待机状态的对象 除非你明确控制 否则他是不会执行函数体内的代码的
Function.prototype.toString = function(){return 123;}
function say()
{
alert("a");
}
function exe(f)
{
alert(typeof f); // function
alert(f); // 返回function的toString,默认就是该表达式's 字符串
f();
}
window.onload=exe(say);
JS在引用的时候,是引用类型。也就是function exe(f)
{
alert(f);
f();
}
这个代码被调用的时候f只是一个引用参数,它存储的是say函数的地址值。这个没错,但是JS没有像C++一样强类型,还有指针这个语法。JS只有引用传参,你非要理解的话你可以理解成是C++中的函数指针 也就是这里的f 是一个指针,并非是一个地址引用。
另外这里的alert(f),意思是吧f这个指针头string后打印出来,所以是打印出该指针指向的对象实体也就是这里的say函数本身有点乱希望你能理解