Javascript函数参数 返回值 调用例子

一,函数定义调用

Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具备属性和方法,由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。

(1)典型的函数声明
function slide(arguments){
//...code
}
(2)以函数表达式的形式定义函数
var slide = function(arguments){
//...code
}
虽然上面两种方式逻辑上是等价的,但是还是有点小区别:
区别一:例一中的函数会在代码执行以前被加载到作用域中,而例二则是在代码执行到那一行的时候才会有定 义

例子

 代码如下 复制代码

var loveddde = function(num1,num2){ //使用变量初始化

return num1+num2;

}

alert(loveddde(1,2));

function box(num1, num2){//普通函数声明

retrun num1+num2;

}

var box = new Function('num1','b', 'return num1+b');

//使用new的构造函数声明,函数是对象,函数名是指针。

函数调用自身,使用arguments.callee,实现递归

window是一个对象,而且是JS里面最大的对象,是最外围的对象

alert(typeof window); window是对象,类型是对象,window表示全局

alert(this); [object window] this目前表示的是window,因为在window的范围下

alert(typeof this)和window一模一样,所以this就是window

 

 代码如下 复制代码

function sum(num){

if(num <=1){

return 1;

}else{

return num*arguments.callee(num - 1);

}}

alert(sum(4)); 4!

函数属性和方法

box.length

prototype属性

两个方法,apply()和call(),每个函数都包含这两种非继承而来的方法

 代码如下 复制代码

function box(num1, num2){

return num1+num2;}

function sum(num1,num2){

return box.apply(this, [num1, num2]);

function sum2(num1, num2){

return box.apply(this,arguments);}

function sum3(num1, num2){

return box.call(this,num1,num2);}

var color = '红色的'; var box = { color=’蓝色的';};

function sayColor(){

alert(this.color);}

sayColor.call(box); //蓝色的

函数参数设置默认值

 代码如下 复制代码

function simue (){
  var a = arguments[0] ? arguments[0] : 1;
  var b = arguments[1] ? arguments[1] : 2;
  return a+b;
}
alert( simue() ); //输出3
alert( simue(10) ); //输出12
alert( simue(10,20) ); //输出30

二、函数调用

1:方法调用模式。

 代码如下 复制代码
请注意this此时指向myobject。
/*方法调用模式*/
    var myobject={
            value:0,
            inc:function(){
                    alert(this.value)
                }
        }
    myobject.inc()

 
2:函数调用模式
请注意this此时指向window

 代码如下 复制代码
/*函数调用模式*/
   
    var add=function(a,b){
        alert(this)//this被绑顶到window
            return a+b;
        }
    var sum=add(3,4);
    alert(sum)
 

3:构造器调用模式
javascript语言精粹一书建议摒弃这中方式。因为有更好的方式。这里先不介绍。下次发表博文的时候贴出来。
会在这里加一个连接。

 代码如下 复制代码
/*构造器调用模式  摒弃*/
   
    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实例。看最下面的代码。

 代码如下 复制代码
 
/*apply*/
    //注意使用了上面的sum函数
    //与myobject
    //这中调用方式的优点在于可以指向this指向的对象。
    //apply的第一个参数就是this指针要指向的对象
    var arr=[10,20];
    var sum=add.apply(myobject,arr);
    alert(sum);

 
看这个apply真正应用。bind这是一个绑定时间的函数

 代码如下 复制代码
var bind=function(object,type,fn){
            if(object.attachEvent){//IE浏览器
                    object.attachEvent("on"+type,(function(){
                                                           return function(event){
                                                               window.event.cancelBubble=true;//停止时间冒泡
                                                               object.attachEvent=[fn.apply(object)];//----这里我要讲的是这里
                                                               //在IE里用attachEvent添加一个时间绑定以后。
                                                               //this的指向不是到object对象本身所以。我们绑定的function里的this.id是无法正常工作的。
                                                               //但是如果我们用fn.apply(object)
                                                               //这里可以看出我们是把apply的第一个对象也就是this的指向变更给了object所以this.id就变成了
                                                               //object.id 可以正常工作了。
                                                              
                                                               }
                                                           })(object),false);
                }else if(object.addEventListener){//其他浏览器
                        object.addEventListener(type,function(event){
                                                              event.stopPropagation();//停止时间冒泡
                                                              fn.apply(this)
                                                              });
                    }
           
        }
    bind(document.getElementById("aaa"),"click",function(){alert(this.id)});

三、匿名函数

函数关键字(function )语句:

 代码如下 复制代码
function fnMethodName(x) {
    alert(x);
}

    函数字面量(Function Literals):

 代码如下 复制代码
var fnMethodName = function (x) {
    alert(x);
}

    Function()构造函数:var fnMethodName = new Function('x', 'alert(x);')
        上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数。

四、函数字面量和Function()构造函数的区别

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。

 代码如下 复制代码
var f = function fact(x) {
    if (x <  = 1)
        return 1;
    else
        return x * fact(x - 1);
};

    Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
    Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
    用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。var y = "global";

 代码如下 复制代码
function constructFunction() {
    var y = "local";
    return new Function("return y"); // 无法获取局部变量}alert(constructFunction()()); // 输出 "global"

    和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,所以这项技术通常很少使用。而函数字面量表达式和函数关键字定义非常接近。考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。更多详细内容可以阅读《JavaScript : The Definitive Guide,
    5th Edition》的Functions那章。
五、匿名函数的代码模式
    昨天hedger wang在他的blog介绍了几种匿名函数的代码模式:
    错误模式:其无法工作,浏览器会报语法错。

 代码如下 复制代码
    function () {
        alert(1);
    }
    ();

    函数字面量:首先声明一个函数对象,然后执行它

 代码如下 复制代码
。(function () {
        alert(1);
    })();

    优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数

 代码如下 复制代码
。(function () {
        alert(2);
    }
        ());

    Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。

 代码如下 复制代码
void function () {
        alert(3);
    }
    ()

    这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种

时间: 2024-10-13 05:17:20

Javascript函数参数 返回值 调用例子的相关文章

javascript中声明函数的方法及调用函数的返回值_基础知识

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <!--js中声明函数的方法--> <script type="text/javascript"> //因为javascript是弱类型的语言,所以参数不需要加类型.函数的也不需要像c#那样要求所以路径都需要有返回值(这个不像c#语言,而且c#的方法也不需要在方法

PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)_php技巧

本文实例讲述了PHP自定义函数用法.分享给大家供大家参考,具体如下: Demo1.php <?php //标准函数,内置函数 echo md5('123456'); echo '<br/>'; echo sha1('123456'); echo '阅谁问君诵,水落清香浮.'; ?> Demo2.php <?php //创建函数,不要跟系统的内置函数重名 //函数有个特性,必须调用,才可以执行 //无参数表示()里面是空的,无返回就是函数的程序里没有 return functi

c++-调用C++写的SDK包,所提供的函数位于返回值类型和函数名之间的参数是什么。。

问题描述 调用C++写的SDK包,所提供的函数位于返回值类型和函数名之间的参数是什么.. 如图的"APICALL" 我调用dll时忽略它可以吗.. 解决方案 APICALL 应该只是一个简单的.空的宏定义,调用时可以不用管 它的作用只是标识函数是系统定义的 API 解决方案二: 函数调用约定.描述参数入栈.清栈方式等. 解决方案三: 不可以啊,这是调用约定,导入导出之类东西,错了函数调用出错,或者编译出问题 解决方案四: 如果是你自己写这个DLL 头文件里面的#if 需要抄下来 编写的

获取JavaScript异步函数的返回值_javascript技巧

今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: <script> function getSomething() { var r = 0; setTimeout(function() { r = 2; }, 10); return r; } function compute() { var x = getSomething(); alert(x * 2); } compute(); </script> 2.回调函数

JavaScript中如何异步函数的返回值

今天研究一个小问题: 怎么拿到JavaScript异步函数的返回值? 1.错误尝试 当年未入行时,我的最初尝试: <script> functiongetSomething() {  varr = 0;  setTimeout(function() {  r = 2;  }, 10);  returnr; }   functioncompute() {  varx = getSomething();  alert(x * 2); } compute(); </script> 2.回

c-一个有关sort函数第三个参数返回值的疑问

问题描述 一个有关sort函数第三个参数返回值的疑问 #include #include #include using namespace std; const int maxsize = 1000; struct stu{ char name[100]; int age; int score; }; bool cmp(stu a,stu b) { if(a.score < b.score) return true; int temp = strcmp(a.name,b.name); if(te

json-jax rs如何通过调用函数的返回值来返回相应的http状态?

问题描述 jax rs如何通过调用函数的返回值来返回相应的http状态? 需要实现这样的一个功能,在web api里拿到前台传来的json数据,调用DAO方法将该存入数据库中,在web api中根据DAO方法的返回的状态(例如存储成功或者失败)返回相应的http状态.应该是return Response.ok(xxx).build(); 是吗 那里面的xxx是DAO方法吧,那相应的DAO方法应该返回什么呢? 解决方案 顶啊............................ 解决方案二: 顶

asp.net 函数的定义 返回值 调用方法详解说明(vb.net/c#)

asp教程.net 函数的定义 返回值 调用方法详解说明(vb.net/c#),首页我们来看一个vb.net中开的asp.net教程创建一个函数的做法,如下 <script runat="server" language="VB">       Function getName() As String         Return "a"       End Function       Sub Page_Load(s As Obje

Sql Server 存储过程调用存储过程接收输出参数返回值

创建存储过程: ALTER PROCEDURE [dbo].[GetCustomers] (@rowcount INT OUTPUT) AS SELECT [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode] ,[Country] ,[Phone] ,[Fax] FROM [Northwind].[dbo].[Customers] SET @row