JavaScript作为一种基于对象(非严格面向对象)的语言,函数在JS中的地位非同一般:用函数声明类和对象。甚至函数本身也是对象。
一、函数的三种声明方式辨析。
1.function命令
function printAbc(){
console.log(‘ABC‘);
}
2.函数表达式(变量赋值形式)
var printAbc = function (){
console.log(‘ABC‘);
};
注意:1、使用函数表达式形式时务必要有分号。
2、此时function后函数名可有可无,且只在函数内部有效
var fname = function abc(){
console.log(abc.name); /* xxx.name 方法非ECMAScript标准 */
}
fname(); //abc
abc(); //ReferenceError: abc is not defined
这种写法的用处有两个,一是可以在函数体内部调用自身,二是方便除错(除错工具显示函数调用栈时,将显示函数名,而不再显示这里是一个匿名函数)。
3.使用Function构造函数
JS中一切都是对象,声明函数也可以看作构造函数对象。
var f = new Function("a","b","return a+b");
f(1,2); //3
第1到第N-1个参数是函数参数,第N个参数是函数体。
有些人认为,这种定义方式只有傻逼才会用,因为除了奇葩以外别无好处,但是其实真的是有用的- -。
实现一个在线运行和编辑JS代码的程序:
<html>
<head>
<title>JS Run Online</title>
<script type="text/javascript">
function btnOnclick(){
var getDiv = document.getElementById("TextArea");
var text = getDiv.value;
var f = new Function(text);
f();
}
</script>
</head>
<body>
<div align="center">
<textarea id="TextArea" cols="30" rows="10"></textarea>
<input type="button" value="Run" onclick="btnOnclick()">
</div>
</body>
</html>
这段程序功能看起来简单,但是如果用静态语言将是很难实现的,Function构造函数正是JavaScript是动态语言的有力证明——可以在运行过程中让程序修改程序本身,而动态语言的核心就是:所有参数,包括函数体,都视作字符串。(个人理解,不妥望指正)。
二、重复声明问题。
//未完待续