目录
Java中的方法好像不是对象!只是对象的一个方法
函数是对象,函数也有Function的原型对象。所有的函数的f对象实例也可以访问其prototype原型对象。
方法1:call()
方法2:apply()
方法3:bind()
三者总结
更多严格模式要求参考:严格模式 - JavaScript | MDN
什么是闭包
闭包就是一个函数:变量所在的函数就是闭包(函数)
也可以说:任何一个函数的作用域,如果可以访问其它函数内部的局部变量,则产生了闭包现象
闭包的作用:在f 作用域的外部,访问f作用域内的局部变量
在JS中,方法(函数)是一个对象,因此可以return
代码示例
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <script>
- function fn(){
- var num = 10;
-
- function fun(){
- console.log(num);
- }
-
-
- return fun;
- }
-
- var newf = fn();//获得返回的fun函数,相当于把fun拿出来了,这样就可以在 fn的作用域外,使用到了其作用域内的局部变量num啦
- newf(); //10 相当于把【 fn(); → fn调用了fun();】 直接整合为了 【newf();】
-
-
- script>
- head>
- <body>
-
- body>
- html>
浅拷贝
浅拷贝指的是:不同对象之间赋值,若是基本数据类型,则可以完整独立地赋值给新对象,但是对于对象内的对象类型,则只能赋值地址给新对象
浅拷贝示例
浅拷贝语法(语法糖,即上述for循环遍历赋值的JS的一个内置函数封装)
Object.assign(Ctrl+V的对象, Ctrl+C的对象);
深拷贝
原理:利用递归函数,把对象中的对象也用for循环赋值给新的对象
深拷贝没有语法糖,需要我们自己编写函数!
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <script>
- //old obj
- var obj = {
- name: 'Klee',
- age: 10,
- features: {
- color: 'red',
- hobby: 'fishing'
- }
- }
-
- //new obj
- var newObj = {}
-
- //deepcopy
- function deepCopy(newObj , oldObj){
- for(var k in oldObj){
- //获取属性值
- var item = oldObj[k];
-
- //判断是否是对象,若是,则递归调用deepcopy
- if(item instanceof Array){
- //新对象的第k个属性是数组 newObj[k]代表对象nowObj的第k个索引的对象(复习for(in)语法)
- newObj[k] = [];
- deepCopy(newObj[k],item);//递归给数组赋值
- }
-
- //判断是否是数组,若是,则递归调用deepcopy
- else if(item instanceof Object){
- newObj[k] = {};
- deepCopy(newObj[k],item);
- }
-
- //其他情况,则说明该属性是基本数据类型
- else{
- newObj[k] = item;
- }
- }
- }
-
- //测试
- console.log('最开始的obj');
- console.log(obj.features.hobby);
-
- deepCopy(newObj , obj);
-
- console.log('调用了deepcopy后的obj、newObj');
- console.log(obj.features.hobby);
- console.log(newObj.features.hobby);
-
- newObj.features.hobby = 'eating';
- console.log('修改了newObj中对象的属性后的obj、newObj');
- console.log(obj.features.hobby);
- console.log(newObj.features.hobby);
-
-
-
- script>
- head>
- <body>
-
- body>
- html>