走进JavaScript——重拾函数
创建函数
通过构造器的方式来创建函数,最后一个参数为函数体其他为形参
new Function('a','b','alert(a)')
/* function anonymous(a,b) {
alert(a)
}
*/
由于函数体是通过字符串拼接的,因此我们可以用这个特性来实现代码的组合
function foo(){
var a = 10;
console.log(a);
}
new Function('say',foo + 'foo();console.log(say)')('Hello foo');
// 10
// Hello foo
// 实际上以上代码是这样的
function anonymous(say) {
function foo(){
var a = 10;
console.log(a);
}foo();console.log(say)
}
还可以用这个特性来实现json字符串转对象
var json = '{a:123, b:456}';
new Function('return ' + json)();
// Object {a: 123, b: 456}
甚至我们可以利用它来实现重载运算符
function calc(num1,num2,operator){
return new Function('return ' + num1 + operator + num2)();
}
console.log(calc(2,3,'+'));
console.log(calc(5,2,'-'));
// 5
// 3
我们可以将返回的函数作为构造器来创建对象
new new Function();
// Object {}
执行函数
函数名加()可以执行一个函数
function foo(){
console.log(123);
}
foo();
// 123
那如果没有函数名呢
function(){};
// Uncaught SyntaxError: Unexpected token (
也就是不支持直接这么写,我们需要将以上函数改成一段表达式,将函数进行运算就成表达式了
'' + function(){console.log(5)};
// "function (){console.log(5)}"
那么怎么执行它呢,在函数后面加()
'' + function(){console.log(5)}();
// 5
以上代码不太优雅对吧,我们可以用一个()将它包起来
(function(){console.log(123)}());
// 123
()也是会进行运算的
(1) // 1
非惰性求值
只要你给函数传递参数它就会进行运算,并不会因为你没有使用它
var a = 10;
(function(){}(a++,a++));
console.log(a); // 12
非惰性求值得另外一个例子就是在使用alert时
var a = 1;
alert(a+=1,a++); // 2
console.log(a); // 3
第一个输出2是因为alert只接受一个参数,但由于函数是不限制参数个数的并且是非惰性求值所以alert中的第二个参数还是会被运算只是没有被alert使用罢了
函数中的callee、caller
callee的意义就在于当我们使用匿名函数时可以去调用函数本身
var a = 0;
(function(){
if(a > 3) return;
console.log(++a);
arguments.callee();
}());
// 1
// 2
// 3
// 4
还有一种情况是当我们重写函数时
var a = 0;
function foo(){
if(a > 2)return;
console.log(++a);
foo = null;
arguments.callee();
}
foo()
// 1
// 2
// 3
caller的意义就在于我们能够知道此函数是被谁调用的
function f1(){
f2();
}
function f2(){
console.log(arguments.callee.caller);
}
f1();
/* function f1(){
f2();
}
/*
走进JavaScript——重拾函数的更多相关文章
- 走进JavaScript——重拾对象
创建对象 Object构造器的参数如果为空或null.undefined将返回一个空的Object对象,如果为其他值则调用相应的构造器,如 new Object() // Object {} new ...
- 走进javascript——重拾数组
Array构造器 如果参数只有一个并且是Number类型,那么就是指定数组的长度,但不能是NaN,如果是多个会被当做参数列表. new Array(12) // (12) [undefined × 1 ...
- 重拾算法之复杂度分析(大O表示法)
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- CSS魔法堂:重拾Border之——不仅仅是圆角
前言 当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-t ...
- JavaScript 基础回顾——函数
在JavaScript中,函数也是一种数据类型,属于 function 类型,所以使用Function关键字标识函数名.函数可以在大括号内编写代码并且被调用,作为其他函数的参数或者对象的属性值. 1. ...
- 重拾qt
最近公司又接了一个煤矿的项目,要写个小程序摘取数据,我是公司唯一c++程序员,本来搞ios搞好好的,现在又得重拾半年没摸得qt了.呵呵...呵呵呵. 这里只记录这次小程序的一些小的总结吧.. 1.中文 ...
- Javascript中的函数
Javascript中的函数 1.什么是函数 函数是被命名的,独立的,完成特定功能的代码段.其可能给调用它的程序返回值,我们把这个代码段就称之为"函数". 被命名的:函数大部分都是 ...
- JavaScript原生数组函数
有趣的JavaScript原生数组函数 在JavaScript中,可以通过两种方式创建数组,构造函数和数组直接量, 其中后者为首选方法.数组对象继承自Object.prototype,对数组执行typ ...
- 重拾C
重拾C,一天一点点_10 来博客园今天刚好两年了,两年前开始学编程. 忙碌近两个月,项目昨天上线了,真心不容易,也不敢懈怠,接下来的问题会更多.这两天调试服务器,遇到不少麻烦. 刚出去溜达了一下,晚上 ...
随机推荐
- 电铸3D18K硬金 电铸易熔合金 电铸中空硬金饰品合金
俊霖电铸3DK金易熔合金是要求相互关连,互为条件,缺一不可,是产品完整性和完美性的重要体现. 第一.适用性:电铸3DK金易熔合金的性能应适用于电铸.首饰.K金饰品.摆件等工艺品的易熔合金 ...
- javascript之fill()方法
无意中看到fill这个方法,有些不解,起初以为是人家自定义的方法,后来才发觉原来不是,javascript里面是真的有这个方法,于是特地学习了下. fill()方法的作用是使用一个固定值来替换数组中的 ...
- 如何查看dede版本信息
dedecms版本信息 更新日期 it 分类: dedecms 打开 /include/common.inc.php 查找 $cfg_version 可以看到版本号 /打开 data/admin/ve ...
- 如何看apache的版本号
在服务器上输入httpd -v就可以看到 在服务器上运行apachectl -v命令即可 Server version: Apache/2.2.3 Server built: Feb 25 2012 ...
- 有经验JAVA程序员如何提升自己?
作为一个具有一到五年开发经验程序员,需要学习内容很多: JVM/分布式/高并发/性能优化/Spring MVC/Spring Boot/Spring Cloud/MyBatis/Netty源码分析等等 ...
- Dubbo底层采用Socket进行通信详解
由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n 通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...
- Mybatis延迟加载和查询缓存
摘录自:http://www.linuxidc.com/Linux/2016-07/133593.htm 阅读目录 一.延迟加载 二.查询缓存 一.延迟加载 resultMap可以实现高级映射(使用a ...
- Mac下用SSH连接远程Linux或Mac服务器
1.打开Mac终端 2.切换到root登录 输入命令:sudo -i,然后输入本机密码 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px &qu ...
- 解决 vmware workstations 14 开启虚拟机黑屏
某些朋友在使用vmware workstations 14创建或者开启虚拟机时发现黑屏,但其实系统的正常启动的,只是无画面显示. 1.以管理员方式启动命令行 2.修复LSP 在CMD中输入 netsh ...
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...