一】、定义:

 /**
* 函数表达式
*
* 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. swift基础语法之——变量和常量

    swift使用let关键字来定义常量,使用var来定义变量,变量在使用前必须初始化(赋初始值) swift是类型安全语音,即不同类型的变量不能一起运算,必须转成同一类型才可以 变量的类型在声明时不必给 ...

  2. 树链剖分【洛谷P1505】 [国家集训队]旅游

    P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...

  3. luogu2522 [HAOI2011]Problem b

    luogu2522[HAOI2011]Problem b 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公 ...

  4. Leetcode 520. Detect Capital 发现大写词 (字符串)

    Leetcode 520. Detect Capital 发现大写词 (字符串) 题目描述 已知一个单词,你需要给出它是否为"大写词" 我们定义的"大写词"有下 ...

  5. 对状压dp的见解

    看了好几篇博客,终于对一些简单的状压dp有了点了解.就像HDU1074. 有个博客:https://blog.csdn.net/bentutut/article/details/70147989 感觉 ...

  6. spring中IOC容器注册和获取bean的实例

    spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结 1.使用xml文件配置 在idea中创建maven工程,然后创建实例Person,然后在 ...

  7. 查看和导入证书(.cer / .pfx)

    作为文件形式存在的证书一般有这几种格式: 1.带有私钥的证书 由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形 ...

  8. vue安装常用插件命令

    1. 安装element-ui npm i element-ui -S 2. 安装vuex npm install vuex --save 3. 安装axios npm install --save ...

  9. Python文件操作,异常语法

    1.文件 2.异常 1.文件的输入输出 #1.打开文件 open 函数open(file,[option])#file 是要打开的文件#option是可选择的参数,常见有 mode 等​#2.文件的打 ...

  10. git学习--远程分支删除

    查看远程分支 git branch -r  使用下面两条命令来删除远程分支 git branch -r -d origin/branch-name git push origin :branch-na ...