函数声明:javascript定义函数(声明函数)可以有2种方法:正常方法和构造函数。其中正常方法中又分为两种巨不同的定义方法;
正常方法:1、函数声明(全局的) :function sayA() { alert("i am A"); }
2、函数表达式(局部的): var sayB = function() { alert("i am B"); }
区别:前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义,这可以使用全局的概念理解,因为前者是全局,在没有调用前已经被加载;Javascript 中函数声明和函数表达式是存在区别的,函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。而函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
第一种函数声明的方法默认是全局的.我们都知道全局成员不是编程的最佳实践,在没有通过明确所有者对象而直接调用的函数中,如sayA() ,将导致this的值成为默认对象(浏览器中的窗口)。
实例:使用函数声明的方法定义一个函数:makeArry,
<script type="text/javascript">
function makeArray(arg1, arg2){
return [ this, arg1, arg2 ];
}
</script>
然后简单的调用makeArray(
'one'
,
'two'
)
;返回值:[ window, 'one', 'two' ];
然后我们变相的修改下函数的声明:让我们现在创建一个简单的对象,使用 makeArray函数作为它的一个方法,我们将使用json的方式来声明一个对象,我们也来调用这个方法:
var arrayMaker = {
someProperty: 'some value here',
make: makeArray
};
//调用
arrayMaker.make('one', 'two');
// 输出=> [ arrayMaker, 'one', 'two' ]
//调用
arrayMaker['make']('one', 'two');
// 输出=> [ arrayMaker, 'one', 'two' ]
看到这里的不同了吧,返回值:[ arrayMaker, 'one', 'two' ];this的值变成了对象本身.你可能会疑问原始的函数定义并没有改变,为何它不是window了呢.好吧,这就是函数在JSavacript中传递的方式,函数在JavaScript里是一个标准的数据类型,确切的说是一个对象.你可以传递它们或者复制他们.就好像整个函数连带参数列表和函数体都被复制,且被分配给了 arrayMaker里的属性make,那就好像这样定义一个 arrayMaker:
var arrayMaker = {
someProperty: 'some value here',
make: function (arg1, arg2) {
return [ this, arg1, arg2 ];
}
};
构造函数: var add = new Function('a','b','return a+b;');这种方法作为我来说不常用,本人也没有这么多精力深入研究JS。
JS的函数声明搞定了,接下来看看JS的调用:来源:leejersey
1、方法调用模式
/*方法调用模式*/ var myobject={ value:0, inc:function(){ alert(this.value) } } myobject.inc() //请注意this此时指向myobject。
2、函数调用模式
/*函数调用模式*/ var add=function(a,b){ alert(this)//this被绑顶到window return a+b; } var sum=add(3,4); alert(sum) //请注意this此时指向window
3、构造器调用模式
/*构造器调用模式 摒弃*/ var quo=function(string){ this.status=string; } quo.prototype.get_status=function(){ return this.status; } var qq=new quo("aaa"); alert(qq.get_status());
4、 apply调用模式 原文没看懂就搜素了另一篇介绍apply的内容。这里也不是我研究的重点,忽略!