关闭

JS函数(一)

标签: js函数this
2285人阅读 评论(0) 收藏 举报
分类:

准备发一个系列,今天先说函数

函数

        定义函数方式有两种,一种是函数声明,另一种是函数表达式

函数声明的语法

            function fn(a,b,c){

            };

关于函数声明它有一个重要特征就是函数声明提升,意思就是在执行代码之前会先读取函数声明也就是说我们可以把函数声明放在调用他的后面

    sayHello();
            function sayHello(){
                console.log("Hello");
            };

上述例子不会出现错误,因为在代码执行前会先读取函数声明

函数表达式
函数表达式有几种不同的语法形式,下面是最常见的一种形式

            var fnDp=function(a,b,c){
                //函数体
            };

这种形式好像看起来是常规的变量赋值语句,即创建一个函数并将它赋值给变量fnDp,这种情况下创建的函数叫匿名函数。匿名函数的name属性是空字符串。

函数表达式和其他表达式一样,在使用前必须先赋值,一下代码会导致错误。

sayHello1();
    var sayHello1=function (){
            console.log("Hello");
        };

理解函数提升的关键,就是理解函数声明与函数表达式之间的区别。例如执行一下代码的结果可能会让人意想不到.

    //不要这样做
            var condition =false;
            if(condition){
                function sayHello1(){
                    console.log("Hello");
                };
            }else{
                function sayHello1(){
                    console.log("Hi");
                };
            }

表面上看,以上代码表示condition为true时,定义一个弹出hello的sayHello1函数否则就是弹出Hi实际上,在ECMAScript中属于无效语法,javascript引擎会尝试修改错误,将其转化为合理状态,但浏览器尝试修复的方式并不一致,大多说浏览器会返回第二种声明,忽略condition;Firefox会在condition为true时返回第一个声明。因此这种方式是非常危险的,不应该出现在你的代码中,不过,如果使用函数表达式,那就no problem 了

//可以这样做
            var sayHello1

            if(condition){
                sayHello1=function (){
                    console.log("Hello");
                };
            }else{
                sayHello1=function(){
                    console.log("Hi");
                };
            }

这个例子不会出现什么意外,不同的函数会根据不同的condition 被复制给sayHello1。

This

var name='world';
            var obj={
                name:"wdl",
                getName:function(){
                    return function(){
                        return this.name;
                    }
                }
            }
            console.log(obj.getName()());//world

以上代码先创建一个全局变量name,又创建了一个包含name的对象。这个对象还包含一个方法getName(),他返回一个匿名函数,而匿名函数又返回this.name.由于getName()返回一个函数,因此调用object.getName()()就会立即调用它返回的函数,结果就是返回一个字符串。然而这个例子返回的字符串是“world”,即全局name变量的值。为什么匿名函数没有取得其包含作用域(或外部作用域)的this对象呢每个函数在被调用时,其活动对象都会自动取得两个特殊变量:this和arguments.函数内部在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量,不过如果把外部作用域中的this对象保存在一个闭包能访问到的变量里,就可以让闭包访问该对象了

var name='world';
            var obj={
                name:"wdl",
                getName:function(){
                    var that=this;
                    return function(){
                        return that.name;
                    }
                }
            }
            console.log(obj.getName()());//wdl

与之前代码的不同之处是在定义匿名函数之前,我们把this对象赋值给一个名叫that的变量。而在定义了闭包之后,闭包也可以访问这个变量,即使在函数返回之后,that也仍然引用着object,所以调用obj.getName()()返回“WDl”

如果上述你感觉难理解你也可以这样理解,obj.getName()()会直接调用

function(){
return this.name;
}

    function(){
                    return that.name;
                }

因为在这两个函数运行时会自动创建this和arguments.函数内部在搜索这两个变量,这里的this就是指当前函数的this,我们知道匿名函数的this是指向window的(严格模式下的this不再是window,而是undefined),所以第一个函数返回“world”,而第二个因为定义了that,所以返回“wdl”

如有不足请指出

1
0
查看评论

JS函数(一)

函数JS对象与函数关系更近,与Java类与方法分明有所不同,JS中的函数也就是对象。 函数也可以被定义在其他函数中,一个内部函数除了可以访问自己的参数和变量,也可以访问把它嵌套在其中的父函数的参数和变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称作闭包。 调用调用一个函数...
  • War3cdota
  • War3cdota
  • 2016-12-14 13:20
  • 202

Javascript(一)-14-(JS函数)

【JS的函数】 函数就是一个功能的封装体。定义功能通常需要两个明确: 1.功能的结果 2.功能实现中的参与运算的未知的内容 (【注意】Java是先明确1再明确2,而JavaScript是先明确2再明确1) JS中定义函数的格式(JavaScript是弱类型,不需要在函数名之前加返回值类型):...
  • wy_0928
  • wy_0928
  • 2015-08-20 11:21
  • 150

js函数总结

js函数学习总结
  • liujie19901217
  • liujie19901217
  • 2016-02-22 10:02
  • 496

js函数的一些小细节

js函数用法小细节 var a=3710; document.write(a/1000+""); document.write(a/1000*1000); function show(x,y){ var sum=x+...
  • liuqiangkaiduyaqian
  • liuqiangkaiduyaqian
  • 2016-05-31 16:21
  • 95

JS函数

js函数(比较全) 2008-01-29 js函数集 ·字符串(String)  1.声明  var myString = new String("Every good boy does fine.");  va...
  • Rachel8023
  • Rachel8023
  • 2015-04-22 15:34
  • 280

Javascript(一)-17-(JS函数_动态函数)

【JS动态函数】 使用的是JS中内置的一个对象Function(大写)。 参数列表,函数体都是通过字符串动态指定的。 【代码】 var add = new Function("x,y","var sum; sum=x+y; return s...
  • wy_0928
  • wy_0928
  • 2015-08-20 11:24
  • 216

Javascript(一)-18-(JS函数_匿名函数)

【JS的匿名函数】 即没有名字的函数,通常是函数的简写形式,相当于匿名对象。 【代码】 var add = function(a,b){//定义一个变量add指向对象,没有在function后面指定名字 return a+b; } alert(add...
  • wy_0928
  • wy_0928
  • 2015-08-20 11:25
  • 139

js函数

js函数集 ·字符串(String)  1.声明  var myString = new String("Every good boy does fine.");  var myString = "Every good b...
  • zch681990
  • zch681990
  • 2014-03-11 20:49
  • 405

js 函数的命名

js中,不存在函数的重载问题,但函数名称相同时,最后一个函数会自动的将前面的函数进行覆盖,与函数内部的形参没有关系,实际中,在调用函数的形参时,是想将实参传递给了一个argument的数组对象,然后将该对象的值赋给实际的参数 /* 函数: 函数的定义格式: function 函数...
  • weixin_37839711
  • weixin_37839711
  • 2018-01-07 14:37
  • 22

js函数以及js函数表达式

一声明与表达式的格式 1 声明式的格式 2 表达式的格式 二区别 1 函数表达式可以直接在后面加括号执行而函数声明不可以 2 函数表达式可以被提前解析出来 3 命名函数表达式跟匿名函数表达式的区别一、声明与表达式的格式1.1 声明式的格式:函数声明: function 函数名(){} 例子:fu...
  • hp5321
  • hp5321
  • 2016-12-21 15:57
  • 167
    个人资料
    • 访问:26567次
    • 积分:786
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:18篇
    • 译文:1篇
    • 评论:5条
    博客专栏
    文章分类
    最新评论