var函数

经典面试题:js继承方式下

拜拜、爱过 提交于 2020-02-09 18:31:35
上一篇讲解了构造函数的继承方式,今天来讲非构造函数的继承模式。 一、object()方法 json格式的发明人Douglas Crockford,提出了一个object()函数,可以做到这一点。 function object(o) {     function F() {}     F.prototype = o;     return new F();   } 二、浅拷贝 除了使用"prototype链"以外,还有另一种思路:把父对象的属性,全部拷贝给子对象,也能实现继承。 下面这个函数,就是在做拷贝: function extendCopy(p) {     var c = {};     for(var i in p) {       c[i] = p[i];     }     c.uber = p;     return c;   } 三、深拷贝 所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。 function deepCopy(p, c) {     var c = c || {};     for(var i in p) {       if(typeof p[i] === 'object') {         c[i] = (p[i].constructor === Array) ? [] : {};  

工作中,如何衡量一个人的 JavaScript 编码水平?

a 夏天 提交于 2020-02-09 12:27:51
1、立即执行函数 立即执行函数,即Immediately Invoked Function Expression (IIFE),正如它的名字,就是创建函数的同时立即执行。它没有绑定任何事件,也无需等待任何异步操作: (function() {// 代码})(); function(){…}是一个匿名函数,包围它的一对括号将其转换为一个表达式,紧跟其后的一对括号调用了这个函数。 立即执行函数也可以理解为立即调用一个匿名函数。立即执行函数最常见的应用场景就是:将var变量的作用域限制于你们函数内,这样可以避免命名冲突。 2、 闭包 对于闭包(closure),当外部函数返回之后,内部函数依然可以访问外部函数的变量。 function f1() {var N = 0; // N是f1函数的局部变量function f2() {// f2是f1函数的内部函数,是闭包 N += 1; // 内部函数f2中使用了外部函数f1中的变量Nconsole.log(N); }return f2;}var result = f1();result(); // 输出1result(); // 输出2result(); // 输出3 代码中,外部函数f1只执行了一次,变量N设为0,并将内部函数f2赋值给了变量result。 由于外部函数f1已经执行完毕,其内部变量N应该在内存中被清除,然而事实并不是这样

柯里化函数

对着背影说爱祢 提交于 2020-02-09 03:58:32
柯里化函数 -- 期待固定数量参数 //固定参数 function fixedCurryParams(fn) { var _args = [].slice.call(arguments, 1) return function () { var newArgs = _args.concat([].slice.call(arguments, 0))    return fn.apply(this, newArgs) } }  //期望参数 参数没给够就一直期望 可以累积参数 function curry(fn, length) { var length = length || fn.length return function () { if (arguments.length < length) { var combined = [fn].concat([].slice.call(arguments, 0)) return curry(fixedCurryParams.apply(this, complay), length - arguments.length) } else { return fn.apply(this, arguments) } } } 测试 function add(a, b, c, d) { return a + b + c + d; } var

[label][JavaScript][The Defined Guide of JavaScript] 变量的作用域

走远了吗. 提交于 2020-02-09 02:15:07
变量的作用域 一个变量的作用域(scope)是程序中定义这个变量的区域。 全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义。 而在函数之内声明的变量,就只在函数体内部有定义,它们是局部(local)变量,作用域是局部性的。 函数的参数也是局部变量,它们只在函数体内部有定义。 在函数体内部,局部变量的优先级比同名的局部变量高。 如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。 例如,下面的代码将输出单词"local scope": var scope = 'global scope'; // Declare global variable function checkScope() { var scope = 'local scope'; // Declare a local variable with the same name document.write(scope); // Use the local variable. not the global one } checkScope(); // Prints "local" 注意:在全局作用域中编写代码是可以不使用var语句,但是在声明局部变量时,一定要使用var语句。 没有块级作用域 JavaScript没有块级作用域

了解Javascript 变量

我的梦境 提交于 2020-02-09 02:12:08
javascript语言变量的作用域可以分为 局部变量 和 全局变量 函数内部定义的变量为局部变量,作用范围在整个函数体内,函数外定义的变量为全局变量,如果在函数内部定义变量时没有使用关键字var,那么该变量默认为全局变量 1.变量必选先定义后使用. //alert(a) //定义之前使用 会提示未定义 var a=23 //使用关键字 var b=34 // 未使用关键字 var 定义 2.同名同作用域的变量,后定定义的变量会覆盖之前定义的变量. var a = 23; var a = 34; //会覆盖之前的定义 3.同名不同作用域的变量,局部变量在其作用范围内会覆盖全局变量 var a = 23 function fn(){ var a = 22; alert(a); } fn(); //显示 22 alert(a); //显示 23 4.全局变量都是windows对象的属性 var x=23; alert(window.x) //显示23 5.没有块作用域,所以应该避免在全局范围内使用for的同时声明变量,否则会导致全局范围的命名污染 for(var i=0;i<5;i++) { } alert(i) // i等于5 来源: https://www.cnblogs.com/answercard/p/3334571.html

javascript变量的作用域

孤者浪人 提交于 2020-02-09 02:10:33
一、基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指的是那个可能多个值组成的对象。 将一个值给变量时,javascript解析器首先要确定是基本类型还是引用类型,基本数据类型可以直接操作保存在变量中的值,而引用数据类型的值是保存在内存中的对象,在操作对象时,实际上操作的是对象的引用而不是实际的对象。 二、变量的赋值 如果从一个变量上向另一个变量上复制 基本数据类型 的值,会在变量对象上创建一个新值,然后把该值复制到新变量的位置上, 如下代码: var num1 = 5; var num2 = num1; 引用类型, 其实同样会将原来变量上的值复制一份到新的变量当中,只不过,复制的其实是原来变量的一个指针,而这个指针指向存储在堆中的一个对象。复制完成后,两个变量都指向了堆中的同一个对象,所以改变其中一个的值,会对另外一个产生影响。如下代码: var obj1 = new Object(); var obj2 = obj1; obj1.name = "Nicholas"; alert(obj2.name); //"Nicholas"    三、传递参数 在javascript里面,参数的传递都是按照 值类型来传递 的,即使你传入的是一个引用类型 function setName(obj) { obj.name = "Nicholas"; } var person =

js函数柯理化

Deadly 提交于 2020-02-08 22:00:05
所谓的函数柯理化,简单来说就是,一个需要接收多个参数的函数,进行分开一个个的传递参数,当函数执行的时候,传递剩余的参数。 主要作用在于增强函数的通用性。 如下举个例子: function custom(fn){ var arg=Array.prototype.slice.call(arguments,1); console.log(arg) return function(){ var otherArg=Array.prototype.slice.call(arguments); console.log(otherArg); var newArg=arg.concat(otherArg); return fn.apply(null,newArg) } } var mathAdd=function(num1,num2){ return num1+num2 } var nowMath=custom(mathAdd,10); console.log(nowMath(5)) 来源: https://www.cnblogs.com/bing1991/p/10180115.html

JavaScript学习-高阶函数

廉价感情. 提交于 2020-02-08 21:27:49
一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 一个例子 function add(x, y, f) { return f(x) + f(y); } var x = add(-5, 6, Math.abs); // 11 console.log(x); Map map()方法定义在JavaScript的Array中 传入我们自己的函数,就得到了一个新的Array作为结果 将数组里面的元素,按照传入map里面的函数,进行转换 function pow(x) { return x * x; } var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81] console.log(results); 把Array的所有数字转为字符串 var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9'] Reduce 有点难说,看表达式吧,就是将当前元素和下一个进行累积计算 [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) 假设先计算A

【javascript】this

删除回忆录丶 提交于 2020-02-08 21:18:23
1、 函数预编译过程 this -->window 2、 全局作用域里 this -->window 3、call//apply 可以改变函数运行时this指向 4、obj.func(); func()里面的this指向obj 5、例题: (1) var f = ( function f() { return "1"; }, function g() { return 2; } )(); typeof f; //结果为‘number,括号里用逗号分隔,取后面那个 (2)     var x = 1; if(function f() {}) { x += typeof f; } console.log(x); //结果‘1undefined’ (3){} == {} -->false 因为{} 为两个不同的空间 (4) var name = '222'; var a = { name : '111', say : function() { console.log(this.name); } } var fun = a.say; fun(); // 222 a.say(); // 111 var b = { name : '333', say : function (fun) { fun(); } } b.say(a.say); // 222 // b 的say 里面的this指向b,

Scala--第四天

Deadly 提交于 2020-02-08 16:05:46
一、迭代器 iterator    适合Scala中所有集合的遍历 1 var a = List(1, 2, 3, 4) 2 var b = a.iterator 3 //hasNext:判断迭代器是否由下一个元素 next:获取下一个元素 4 while (b.hasNext) { 5 println(b.next) 6 } 7 //结果 8 //1 9 //2 10 //3 11 //4 二、函数式编程   用处:Scala 针对集合的操作,简化代码   1.遍历 froeach 1 //完成写法 foreach 中传的是一个函数 :x代表集合(容器)中的每一个元素 2 //注意:foreach没有返回值 ,即为Unit 3 a.foreach((x: Int) => { 4 println(x) 5 }) 6 //简化写法一:省去参数的类型指定 ,scala做类型推断 7 a.foreach(x => println(x)) 8 //建议写法二:使用下划线 代替 集合中的每个元素 9 a.foreach(println(_))   2.映射 Map     格式:原始集合.map(f:(A)) #A:代表集合中的每个元素       返回值是一个新的集合 1 var a = List(1, 2, 3, 4) 2 //每个集合中的元素+1 得到新的集合 3 var b = a