一】、定义:

 /**
* 函数表达式
*
* Function() 构造函数
*
* 函数提升(Hoisting)
* JavaScript默认将当前作用域提升到前面去
* Hoisting应用在变量的声明和函数的声明
* 【使用表达式定义函数时无法提升】
*
* 自调用函数
*
* 函数是对象*/
 //函数表达式储存在变量中
var x = function () { return 'message'; }; console.log(x()); /**
以上函数实际上是一个 匿名函数 (函数没有名称)。
函数存储在变量中,不需要函数名称,通常通过变量名来调用。
上述函数以分号结尾,因为它是一个执行语句。
*/
 //不建议。在 JavaScript 中,很多时候,你需要避免使用 new 关键字。
var myFunction = new Function('a', 'b', 'return a*b');
console.log(myFunction(3, 4));
 //函数提升
//在函数声明之前调用
myFunction(); function myFunction() {
console.log(233);
}
 //自调用函数,是一个表达式,有括号把表达式括起来
(function () {
console.log('Hello'); //我将调用我自己
})();
 //函数是对象,函数有属性和方法
console.log(typeof(function add() {})); //function //arguments.length 属性返回函数调用过程接收到的参数个数
//arguments是JavaScript的内置对象
function myFunction(a, b){
console.log(arguments.length);
} myFunction(1, 2); //
myFunction(); //
myFunction('test'); // //总结:
//函数定义作为对象的属性,称之为对象方法。
//函数如果用于创建新的对象,称之为对象的构造函数。

二】、参数

 /**
* 函数参数
*
* arguments 对象
* arguments对象包含了函数调用的参数数组
* */ /**
* 如果函数在调用时缺少参数,参数会默认设置为: undefined
有时这是可以接受的,但是建议最好为参数设置一个默认值*/
function add(x, y){
if(y === undefined) {
y = 0;
}
//或者:
//y = y || 0;
//如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。
console.log( x + y);
} add(2);
console.log(Boolean(undefined)); //false
 //查找最后一个参数的值
function findMax() {
var maxNum = 0; for(var i = 0;i < arguments.length;i++) {
if(arguments[i] > maxNum) {
maxNum = arguments[i];
}
}
console.log(maxNum);
}
findMax(4,5,6); //
 function sumAll() {
var sum = 0; for(var i = 0;i < arguments.length;i++) {
sum += arguments[i];
}
console.log(sum);
}
sumAll(4,5,6); //

三】、调用

 /**
* 函数的调用:
*
* 1.作为一个函数调用
*
* 2.作为对象的方法调用
*
* 3.构造函数new调用函数
*
* 4.call()、apply()调用函数
* call([thisObj[,arg1[, arg2[, [,.argN]]]]])
* call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 */ var myObject = {
myName: 'lqc',
myPets: ['HuaDou', 'ErBao'],
fullInformation: function () {
return this.myName + ' have ' + this.myPets[1];
}
}; console.log(myObject.fullInformation()); function multiply(a, b) {
return a*b;
} console.log(multiply.call(myObject, 5, 6));
console.log(multiply.apply(myObject, [5, 6]));

四】、闭包

闭包:
私有变量可以用到闭包

 // 计数菌
var add = (function (){
var counter = 0; return function () {
return counter++;
}; })(); console.log(add());
console.log(add());
console.log(add());
 //定义多个嵌套函数
function counter() {
var counter = 0; return {
count: function () {
return counter++;
},
reset: function () {
return counter = 0;
}
};
} var c1 = counter();
var c2 = counter(); console.log(c1.count());
console.log(c1.count());
console.log(c1.count()); console.log(c2.count());
console.log(c2.count());
console.log(c2.reset());

五】、call()方法和apply()方法

参考:http://www.cnblogs.com/lqcdsns/p/5349496.html

(九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]的更多相关文章

  1. js函数定义 参数只要写名称就可以了

    js函数定义  参数只要写名称就可以了 以下为标准: function add(type)  { } 不要写成下面这个样子 function add(var type)  { } 哎 妹的  老何ja ...

  2. js函数定义参数个数和实际传入参数的对比

    因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...

  3. javascript、jQuery函数定义和调用方法

    一.javascript 1.var aaa=function(){...} var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用. 2.function aaa(){...} f ...

  4. js函数定义和调用

    由于JavaScript的函数也是一个对象,上述定义的abs()函数实际上是一个函数对象,而函数名abs可以视为指向该函数的变量. var abs = function (x) { if (x > ...

  5. js加载事件和js函数定义

    一  dom文档树加载完之后执行一个函数 在Dom加载完成后执行函数,下面这三个的作用是一样的,window.onload 是JavaScript的,window.onload是在dom文档树加载完和 ...

  6. js函数的参数

    js函数的参数: js是弱类型的编程语言,调用函数时既不在乎函数的参数,也不在意参数的类型 即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数.可以传递一个.三个甚至不传递参数,而 ...

  7. js 函数定义的方式

    js 函数定义的方式 一.总结 一句话总结: 最常见就下面三种 最常见:function func1([参数]){/*函数体*/} 将匿名函数赋值给变量:var func2=function([参数] ...

  8. js 函数定义三种方式

    <p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...

  9. Linux Shell函数定义与调用

    一.Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分----表示可选(即可有可无) your_function_name部分----为函数名 ...

  10. js 函数定义的2种方式

      js 函数定义的2种方式 CreateTime--2018年3月29日18:36:14 Author:Marydon 方式一: /** * 函数式声明 */ function mode() { c ...

随机推荐

  1. linux 远程连接ssh提示 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决

    Linux ssh 远程登录到其他机器上时,有时会出现登不进去,并弹出如下类似提示的情况: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  2. 树状数组【bzoj1103】: [POI2007]大都市meg

    1103: [POI2007]大都市meg 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了. 不过,她经常回忆起以前在乡间漫步的情景.昔日,乡 ...

  3. IE兼容css3圆角的htc解决方法

    IE兼容css教程3圆角的htc解决方法 现在css3的border-radius属性可以很方便的实现圆角功能,对网站前台人员无疑是一件喜事,但悲剧的是IE6/7/8并不支持,让我们弃新技术不用,是不 ...

  4. GitLab 遇到的坑

    Job for postfix.service failed because the control process exited with error [zbb@storage1 ~]$ sudo ...

  5. python3 logging笔记

    #coding:utf-8import logging logger = logging.getLogger("simple_example")#可以说是日志信息的名字吧,可以随便 ...

  6. java中检测网络是否相通

    转载:https://www.cnblogs.com/moon-jiajun/p/3454576.html 1 package com.cjj.client; 2 3 import java.io.I ...

  7. esper(4-1)-简单context

    1.创建context语法 create context context_name partition [by] event_property [and event_property [and ... ...

  8. centos7安装与卸载软件

    安装 yum install 服务名 查看服务名 rpm -qa |grep -i aerospike 或者 yum list installed | grep aerospike 卸载 yum re ...

  9. WindowsMTU修改

    MTU是英文Maximum Transmission Unit的缩写,意为"最大传输单位".也就是通过TCP/IP协议所传输的数据包最大有多少字节,对于网速有极大的影响, MTU并 ...

  10. eclipse+pydev 安装和配置过程

    安装 PyDev 在安装 PyDev 之前,要保证您已经安装了 Java 1.4 或更高版本.Eclipse 以及 Python.接下来,开始安装 PyDev 插件. 启动 Eclipse,利用 Ec ...