js函数相关
Posted 简单的小伙子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js函数相关相关的知识,希望对你有一定的参考价值。
js函数杂记:
js中的回调函数
js中的回调函数的理解:回调函数就是传递一个参数话函数,就是将这个函数作为一个参数传到另外一个主函数里面,当那个主函数执行完之后,再执行传递过去的函数,走这个过程的参数化的函数,就叫回调函数,换个说法也就是被作为参数传递到另一个函数(主函数)的那个函数就叫做回调函数。
回调函数:函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。”,这句话的意思是函数b以一个参数的形式传入函数a并执行,顺序是先执行a ,然后执行参数b,b就是所谓的回调函数
function a(callback)
alert('a');
callback.call(this);//或者是 callback(), callback.apply(this),看个人喜好
function b() // 为回调函数。
alert('b');
//调用
a(b);
js中的回调函数:官方解释,当程序跑起来的时候,一般情况下,应用程序会时常通过API调用库里的所先预备好的函数,但是有些库函数,却要求应用先传给它的一个函数,好在适合的时候调用,以完成目标任务。这个被传入的,后又被调用的函数成为回调函数。
通常将一个函数B传入另外一个函数A,并且在需要的时候调用A.,说白了就是回溯函数,先定义好将要使用的函数体,饭后在使用在调用这个函数我们通常把callback作为一个参数传入定义的那个函数。下面我们看一段js代码,看回调函数是怎么实现的:
function Buy(name,goods1,callback)
alert(name+' buy '+goods1);
if(callback&&typeof(callback)==="function")
callback();
Buy('xiaoming','apple',function()
alert("shopping finish");
);
一个简单的代码,一开始不知道要买啥,等到买东西的时候,立即把之前定义好的函数调用出来,最好加上判断,因为一切的前提是callback必须是一个函数,输出结果为:
xiaoming buy apple
shopping finish
闭包与回调:
什么是闭包?
js中hasOwnProperty()
js属性对象的hasOwnProperty()方法,返回的是一个布尔值,判断对象是否包含特定的自身(非继承)属性。基础用法
var o = new Object();
o.prop = 'exists';
function changeO()
o.newprop = o.prop;
delete o.prop;
o.hasOwnProperty('prop'); // true
changeO();
o.hasOwnProperty('prop'); // false
js数组函数,arry中every()方法,
定义和用法:
every()方法适用于支持数组所有元素是否符合制定条件(通过函数提供)
every()方法使用指定函数检测数组中的所有元素
- 如果数组中检测到有一个元素不满足所判断情况,则整个表达式返回false,且剩余的元素不会再进行检测。
- 如果所有的函数都满足条件,则返回true。
其中,every()不会对空数组进行检测,every()不会改变原始数组。
语法:arry.every(function(currentValue,index,arr),thisValue)
参数说明:
- function(currentValue,index,arr),必须,函数,数组中的每个元素都会执行这个函数,函数参数:
- currentValue,必须,当前元素值。
- index,可选,当前元素的索引值
- arr 可选,当前元素属于的数组对象
- thisValue,可选,对象做为该回执函数时调用,传递给函数,用作“this”的值,如果省略了thisValue,“this”的值为“undefined”
还需要注意的是:返回值为布尔值,如果所有的元素都通过了检测返回true,否则返回false。
js中Array中的some()方法,
定义和用法:
some()方法用于检测数组中元素是否满足指定条件(函数提供,也就是自己所写的函数),some方法以次执行数组的每个元素。
- 如果一个元素满足条件,则表达式返回true,剩余的元素不会再执行检测
- 如果没有满足条件的函数,测返回false。
注意:some()不会对空数组进行检测,some()不会改变原始数组
语法:array.some(function(currentValue,index,arr),thisValue)
- 参数:function(currentValue,index,arr)必须,函数,数组中的每个元素都会执行这个函数,函数参数:
- currentValue,必须,当前元素值
- index,可选,当前元素的索引值
- arr,可选,当前元素属于的数组对象
- thisValue,可选,对象作为该执行回调时使用,传递给函数,用作“this”的值,如果省略了“thisValue”,“this”的值为“undefined”
注意点:返回值为布尔值,如果数组中有元素满足条件返回true,否则返回false。
Object.assign()的使用
属于ES6的东西
Object.assign
方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)中。
可枚举属性
:可枚举属性和不可枚举属性是由对象的属性的enumerable
值决定,可枚举属性是指那些内部enumerable 标志设置为 true 的属性对于通过直接的赋值和属性初始化的属性,该标识值默认为即为 true。但是对于通过 Object.defineProperty 等定义的属性,该标识值默认为 false。可枚举的属性是可以通过for…in循环遍历(除非该属性名是一个Symbol),或者是通过Object.keys()方法可以返回一个可枚举的属性的数组,(Object.keys()不能返回不可枚举属性)。客串一下知识,可枚举属性和不可枚举属性。js对象的可枚举属性和不可枚举属性
其中js中基本包装类型的原型对象的属性是不可枚举的,如Object, Array, Number等。
const target = a: 1 ;
const source1 = b: 2 ;
const source2 = c: 3 ;
Object.assign(target, source1, source2);
target // a:1, b:2, c:3
Object.assign
方法的第一个参数是目标对象,后面的参数是源对象,其中,如果目标对象与源对象有同名的属性的话,或者多个源对象有同名属性,则后面的属性会覆盖前面的属性。附上代码:
const target = a: 1, b: 1 ;
const source1 = b: 2, c: 2 ;
const source2 = c: 3 ;
Object.assign(target, source1, source2);
target // a:1, b:2, c:3
注意点:
1、Object.assign
方法实行的是浅拷贝,而不是深拷贝,也就是说,如果源对象某个属性值是对象,那么目标对象浅拷贝得到的是这个对象的引用。附上代码:
const obj1 = a: b: 1;
const obj2 = Object.assign(, obj1);
obj1.a.b = 2;
obj2.a.b // 2
上面的代码中,源对象obj1的a属性的值是一个对象,Object.assign
拷贝得到的是这个对象的引用,这个对象的任何变化,都会反映到目标对象上面。
2、同名属性的替换,对于这中嵌套的对象,一旦遇到同名属性,object.assign
的处理方法是替换,而不是添加。
const target = a: b: 'c', d: 'e'
const source = a: b: 'hello'
Object.assign(target, source)
// a: b: 'hello'
上面的代码中,target对象的a属性被source对象的a属性给替换掉了,而不会得到a:b:‘hello’,d:‘e’的结果,这通常不是开发者所需要的,需要特别注意。
3、数组的处理,Object.assgin
可以用来处理数组,但是会把数组作为对象。
Object.assign([1, 2, 3], [4, 5])
// [4, 5, 3]
上面代码中,Object.assign
把数组视为属性名为 0、1、2 的对象,因此源数组的 0 号属性4
覆盖了目标数组的 0 号属性1
。
4、取值函数的处理
Object.assign
只能进行对值进行复制,如果要复制的值是一个取值函数,那么将求值后再复制
以上是关于js函数相关的主要内容,如果未能解决你的问题,请参考以下文章