0%

Frontend-Day12——JSFunction

函数对象的属性

1
2
3
4
5
6
7
8
9
10
11
12
13
<script>
function foo() {}
var bar = function() {}
// 自定义属性
foo.message = "hello "
console.log(foo.message)
//1.name属性
console.log(foo.name,bar.name)

//2.length本来接受参数的个数
function foo(a,b,c) {}
console.log(foo.length)
</script>

Arguments

arguments是一个类数组对象,可以用索引找元素,但无法用filter等方法

因此可以把arguments转Array

1
2
3
4
function foo() {
var newArgs1 = Array.from(arguments)
var newArgs2 = [...arguments]
}

剩余参数

注意rest参数是一个真正的数组,可以进行数组的所有操作

1
2
3
4
function foo(num1, num2, ...otherNums) {
clg(otherNums)
}
foo(222,12,123,123)

函数式编程

纯函数

  • 相同的输入值,需产生相同的输出
  • 函数输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关
  • 不能有语义上可观察的函数副作用,诸如”触发事件”,使输出设备输出,或更改输出值以外物件的内容

柯里化(Curring)

  • 把接受多个参数的函数,变成接受一个单一参数的函数,并且返回接受余下的参数,而且返回结果的新函数的技术
  • 柯里化声称,如果你固定某些参数,你将得到接受余下参数的一个函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   function foo(x, y, z) {
console.log(x + y + z)
}
foo(10, 20, 30)

function foo(x) {
return function(y){
return function(z){
console.log(x, y, z)
}
}
}

foo(10)(20)(30)
//优化写法
var foo3 = x => y => z => console.log(x + y + z)

组合函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
    function double(num){
return num*2
}

function pow(num){
return num ** 2
}

// 实现一个组合函数的封装
function composeFn(...fns){
//1.边界判断(edge case)
var length = fns.length
for (var i =0; i < length; i++){
var fn = fns[i]
if (typeof fn !== "function"){
throw new Error("position ${i} must be function")
}
}
//2.返回的新函数
return function(...args){
var result = fns[0].apply(this, args)
for(var i = 1; i <length; i++){
var fn =fns[i]
result= fn.apply(this,[result])
}
}
}

var newFn = composeFn(double, pow)
console.log(newFn(100))
newFn(100)

with语句的使用(了解)

1
2
3
4
5
6
7
var obj = {
ms: "hello"
}

with (obj) {
console.log(ms)
}

严格模式

  • 严格模式通过抛出错误来消除一些原有的静默错误

严格模式可以在js文件开启,在函数开头开启

1
2
3
4
5
6
js:
"use strict"

function alugg(){
"use strict"
}

严格模式的限制

  • 不会意外创建全局变量
  • 会引起静默失败的复制操作抛出异常
  • 试图删除不可删除的属性
  • 不允许函数参数有相同的名称
  • 不允许使用with
  • this绑定不会转成对象类型

对象属性控制

属性描述符

可以修改属性,可以添加属性

Object.defineProperty()

1
2
3
4
5
6
7
var obj = {
name: "why",
age:18
}
Object.defineProperty(obj, "name", {
configurable: false,
})

Object.definePropertiest一次定义多个属性描述符

  • 数据属性Data Properties描述符(Descriptor)
    • configurable
    • enumerable
    • value
    • writable
  • 存取属性(Accessor访问器 Properties)描述符
    • configurable
    • enumerable
    • get
    • set

通过对象定义属性,configurable,enumerable,writable默认都是true,但通过对象属性描述符默认则是false

**Configurable:**表示属性是否可以通过delete删除属性,是否可以修改它的特性,或者是否可以将它修改为存取属性描述符

**Enumerable:**表示属性是否可以通过for-in或者Objects.keys()返回该属性

**Writable:**表示是否可以修改属性的值

-------------本文结束感谢您的阅读-------------