函数内部有两个特殊对象,this、arguments,其中arguments是一个类数组对象,包含着传入函数中的所有参数,主要用来保存函数参数。arguments对象还有一个callee属性,callee是一个指针,指向拥有这个arguments对象的函数。
function fact(num){
if(num<=1){
return 1;
}else{
return num*fact(num-1);
}
}
这是一个实现阶乘的函数,采用递归的方式,这种方式存在一个问题就是,当fact的名称更改以后,如果不及时更改函数内部的函数名称,该函数则无效。此时采用callee属性替代当前拥有num参数对象的函数也就是fact.
采用callee实现如下
function fact(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1);
}
}
this引用的是函数执行的环境对象,当函数被当做某个对象的方法调用时,此时的this对象引用的是当前调用函数的对象。
不同的环境this指向的值不同,下面是几种this在不同执行环境下所指向的值
当函数作为对象方法的时候,函数里的this被绑定到当前对象上(也可以称之为方法调用)
例如:
var myNum = {
value:1,
increment:function(arg){
this.value +=arg;
}
};
myNum.increment(3);
console.log('example1:'+myNum.value);//example1:4
上述的increment是一个对象方法,该对象方法内部的this指向的就是当前对象
当函数作为非对象方法时候,this绑定到全局对象window,如果此时要调用内部函数可以采用that = this。
// 一般的函数
function add(a){
return a+2 ;
}
var value = 2;
myNum.count = function (){
let value = 1;
let help = function(){
this.value = add(this.value);
}
help();
console.log(this.value);//4
}
myNum.count();
that = this方式
var value = 2;
myNum.count = function (){
let value = 1;
let that = this;
let help = function(){
that.value = add(that.value);
}
help();
console.log(that.value);//3
}
myNum.count();
用new运算符调用构造函数,会先创建一个连接到构造函数的prototype(原型对象),再将this绑定到该对象
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
return this.name;
}
var person1 = new Person('TOM');
console.log(person1.sayName());
绑定this到指定的环境对象
var people = {
name:"LILY"
}
console.log(Person.prototype.sayName.apply(people));
console.log(Person.prototype.sayName.bind(people)());
console.log(Person.prototype.sayName.call(people));
call :方法调用一个具有给定this值的函数,以及提供的参数列表。
apply: 方法调用一个具有给定this值的函数,以及提供的参数(数组或类数组对象)。
bind :方法创建一个新的函数,调用时设置this关键字为提供的“值”。
es6箭头函数里的this指向定义时所在的对象,不是执行的环境对象,就说明this在箭头函数里使用时是一个不变的值
function foo(){
setTimeout(()=>{
console.log('name:',this.name);
},1000)
}
var name = "kiki";
foo.call({name:"didi"});//name:didi
//箭头函数里this的值指向的是定义时所在的环境对象,es5中实现箭头函数的方法:采用 that = this这种机制,实现this的绑定
以上是对函数的内部属性的理解。
我理解的 JavaScript 函数式编程,都认为属于函数式编程的范畴,只要他们是以函数作为主要载体的。
给你的代码增加一点点函数式编程的特性,最近我对函数式编程非常感兴趣。这个概念让我着迷:应用数学来增强抽象性和强制纯粹性,以避免副作用,并实现代码的良好可复用性。同时,函数式编程非常复杂。
Async/await以及它底层promises的应用正在猛烈地冲击着JS的世界。在大多数客户端和JS服务端平台的支持下,回调编程已经成为过去的事情。当然,基于回调的编程很丑陋的。
如果你曾经了解或编写过JavaScript,你可能已经注意到定义函数的方法有两种。即便是对编程语言有更多经验的人也很难理解这些差异。在这篇博客的第一部分,我们将深入探讨函数声明和函数表达式之间的差异。
随着软件应用的复杂度不断上升,为了确保应用稳定且易拓展,代码质量就变的越来越重要。不幸的是,包括我在内的几乎每个开发者在职业生涯中都会面对质量很差的代码。这些代码通常有以下特征:
在js开发中,程序代码是从上而下一条线执行的,但有时候我们需要等待一个操作结束后,再进行下一步操作,这个时候就需要用到回调函数。 在js中,函数也是对象,确切地说:函数是用Function()构造函数创建的Function对象。
这篇文章主要介绍ES5中函数的4种调用,在ES5中函数内容的this指向和调用方法有关。以及ES6中函数的调用,使用箭头函数,其中箭头函数的this是和定义时有关和调用无关。
函数的三种定义方法分别是:函数定义语句、函数直接量表达式和Function()构造函数的方法,下面依次介绍这几种方法具体怎么实现,在实际编程中,Function()构造函数很少用到,前两中定义方法使用比较普遍。
微软 称excel就实现面向开发者的功能,也就是说我们不仅可以全新定义的公式,还可以重新定义excel的内置函数,现在Excel自定义函数增加了使用 JavaScript 编写的支持,下面就简单介绍下如何使用js来编写excel自定义函数。
这篇文章主要讲解:js立即执行函数是什么?js使用立即执行函数有什么作用呢?js立即执行函数的写法有哪些?
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!