博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript学习笔记
阅读量:4495 次
发布时间:2019-06-08

本文共 1898 字,大约阅读时间需要 6 分钟。

// javascript 学习笔记 函数表达式

// 声明函数的两种方式:1、函数声明 2、函数表达式
// 1、函数声明
function functionName(arg0, arg1, arg2) {
//函数体 fireFox Safari, Chrome, Opera都给函数定义了一个非标准的name属性,用于访问函数名,这个值永远在function关键字后面
alert(functionName.name)
}

/* 关于函数声明,有一个重要的特征,就是函数声明提升(function declaration hoisting)

在执行代码之前会先读取函数声明,这样,也就意味着可以把函数声明放在调用它的后面
*/
// 例如
sayHi();
function sayHi(){
alert("Hi!")
}

//2、 函数表达式(创建一个匿名函数[拉姆达函数],并把它赋值给 functionName)

var functionName = function(arg0, arg1, arg2) {
// 函数体
}

// 如果 用函数表达式创建一个函数, 函数表达式和其他表达式一样,使用之前必须给他赋值,否则会报错。这点一定要和函数声明创建函数区分开来

// 永远不要这样做,

if(conditoin){
function sayHi(){
alert("Hi!");
}
}else{
function sayHi(){
alert("Yo!");
}
}
// 因为在ECMAScript中这属于无效语法。JavaScript引擎会尝试修正错误,但是浏览器修正错误的方式不一样。大多数浏览器会返回第二个声明,忽略condition;FireFox会在condtion为true时返回第一个声明。

// 正确的做法

var sayHi;
if(conditoin){
sayHi = function(){
alert("Hi!");
};
}else{
sayHi = function() {
alert("Yo!");
};
}

// 递归的一些陷阱

// 递归是在一个函数通过名字调用自身的情况下构成的
function factorial(num){
if(num <= 1){
return 1;
}else{
return num * factorial(num - 1)
}
}

// 我们如果通过一个变量引用 factorial函数,这个变量就会指向factorial函数,不小心把factorial 置为null时,就会出现错误

var anotherFactorial = factorial;
factorial = null;
alert(anotherFactorial(4));//报错

// 这个问题通过arguments.callee可以解决,仅在非严格模式下有效

function factorial(num){
if(num <= 1){
return 1;
} else {
return num * arguments.callee(num - 1)
}
}

// 原因,通过使用 arguments.callee代替函数名,可以确保无论怎样调用函数,都不会出问题。

// 然而,严格模式下还会报错,有一个两全的方法,这时候就用到命名函数表达式达到相同的结果
var factorial = (function f(num){
if(num <= 1){

} else {

return num * f(num - 1)
}
});

// 闭包

// 以比较条件函数为例
function createComparisonFunction(propertyName) {
return function(object1, object2){
var value1 = object1[propertyName];
var value2 = object2[propertyName];

if (value1 < value2) {

return -1;
}else if (value1 > value2) {
return 1;
}else{
return 0;
}
};
}
// 内部的匿名函数,内部访问到了 外部函数createComparisonFunction 的参数propertyName
// 即使外部

转载于:https://www.cnblogs.com/wjw-blog/p/7171698.html

你可能感兴趣的文章
纯C语言跑分(详细注释)
查看>>
JQuery Ajax 在asp.net中使用总结
查看>>
(转)如何在maven的pom.xml中添加本地jar包
查看>>
JSLink and Display Templates Part 6 – Creating View Templates and Deployment Options
查看>>
Android应用内实现视频播放--腾讯浏览服务(TBS)
查看>>
线程锁和自旋锁的比较
查看>>
手机端页面自适应最简单解决方案—rem布局
查看>>
成为一名优秀程序员所需要知道的15件事
查看>>
python之排序(sort/sorted)
查看>>
读书心得
查看>>
docker使用阿里云镜像加速器(属于自己的专属加速器)
查看>>
css基础5
查看>>
白盒测试与黑盒测试
查看>>
为什么你要用 Spring?
查看>>
94. 二叉树的中序遍历
查看>>
接口详解例子代码(附Java1.8的接口新特性)
查看>>
unity3d 关于断点下载和整个下载(用于更新)
查看>>
神经网络权值为什么不能初始化为零(1)
查看>>
C/C++(内存管理)
查看>>
项目Beta冲刺(团队)——用户试用调查报告
查看>>