foo

apply-call-bind

怎甘沉沦 提交于 2020-04-07 21:48:54
call: var foo ={ value:1 } function bar(name,age) { console.log(this.value); console.log(name); console.log(age); } //bar.call(foo,'gongtao',11); Function.prototype.call2 = function (context) { var args = []; for (var i = 1, len = arguments.length; i < len; i++) { args.push(arguments[i]); } context.fn = this; context.fn(...args); delete context.fn; } bar.call2(foo,'gongtao',111); apply: var foo = { value: 1 } function bar(name, age) { console.log(this.value); console.log(name); console.log(age); } //bar.apply(foo); Function.prototype.apply2 = function (context, arr) { var context = context ||

谈谈神秘的ES6——(五)解构赋值【对象篇】

China☆狼群 提交于 2020-04-07 11:29:26
上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb" 对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。 let { bar, foo } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb" let { baz } = { foo: "aaa", bar: "bbb" }; baz // undefined 上面代码的第一个例子,等号左边的两个变量的次序,与等号右边两个同名属性的次序不一致,但是对取值完全没有影响。第二个例子的变量没有对应的同名属性,导致取不到值,最后等于undefined。 如果变量名与属性名不一致,必须写成下面这样。 let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" let obj = { first: 'hello', last: 'world' }; let { first: f, last: l } = obj; f

谈谈神秘的ES6——(四)解构赋值【数组篇】

柔情痞子 提交于 2020-04-07 10:56:33
今天,我们来讲一个新的概念,叫做解构赋值。那么在ES6中,什么是解构赋值呢?我们先来给它下个定义。 在ES6中,允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。满足解构赋值的前提是:1.等号两边结构一样;2.声明和赋值不能分开;3.右边是具体的“东西”。 在ES5的时候,我们想要对a,b,c三个变量赋值,一般来说都是var三个变量,写三行赋值。有了解构,它可以变成这个样子: let [a,b,c] = [1,2,3] console.log(a);//1 console.log(b);//2 console.log(c);//3 当然,以下的写法也是允许的: let [[arr],str] = [["arr"],"str"]; let [ , , third] = ["foo", "bar", "baz"]; console.log(third) // "baz" let [x, , y] = [1, 2, 3]; console.log(x) // 1 console.log(y) // 3 let [head, ...tail] = [1, 2, 3, 4]; console.log(head) // 1 console.log(tail) // [2, 3, 4] 本质上,这种写法属于“模式匹配”,只要等号两边的模式相同

Spring中事务内部调用引发的惨案

故事扮演 提交于 2020-04-07 05:58:32
在一个类内部有2个方法foo和bar,其中bar方法配有注解(@Transactional),即bar是事务执行的,而foo不是事务执行,当foo方法内部调用bar方法后,bar方法的事务是不生效的。示例代码如下: public class ServiceTest { public void foo(){ this.bar();//调用自身的方法; } @Transactional public void bar(){ System.out.println("this is bar"); //数据库操作 } } 原因如下: Spring中通过注解来完成事务的功能,实际是通过SpringAOP来实现的,而SpringAOP中,使用this来调用自身的方法时 ,此对象引用上的方法 直接会 被调用,不会调用代理的方法(SpringAOP原理是产生代理类)。因此bar方法的事务不会生效。如果直接调用bar方法,此时事务是生效的。 解决方法有: 一、将bar方法放在另一个service类中。这种方法简单,但是造成代码的冗余。 二、可以将注解@Transactional放在foo方法上。这种方法造成的影响:加入foo方法的一些操作是不需要事务的,这会延长事务执行的时间。 三、在foo方法中不要直接使用this来调用bar方法,通过调用代理类的bar方法。 public void foo(){

02-02-08、JDK8的语法糖

风流意气都作罢 提交于 2020-04-05 19:12:24
​1、什么是语法糖 如果要来进行一个拆字游戏的话,语法糖可以拆分成“语法” 和 “糖”,每一种计算机语言都有自己的语法,Java也不例外。 语法就是在这一个语言中,要表示一种行为的表示模式,如赋值:int i = 666;如循环while(foo){},语法在一种语言的运行环境中是原生支持的,是体现在其运行时当中的。 糖是则是一种对于吃它的人来说感觉到甜的碳水化合物,往其他食物中加入糖会让食物变甜,吃糖能让人愉悦。 语法糖(Syntactic Sugar)就是给语法裹上一层糖,因此语法糖也称语法糖衣,让使用这些被裹上糖的语法的编码人员感觉到“甜”。例如,Java中使用for循环语法对一个集合进行遍历,写法为: int [] collection = new int [ 6 ]; for ( int i = 0 ; i < collection.length; i++){ // do something } 而现在,你只需要这么写就行: int [] collection = new int [ 6 ]; for ( int i : collection){ // do something } 是否内心会感到小小的“甜”呢。 有人会感觉很奇怪,我就是这么写的啊,这不就是Java的语法么?还说是什么语法糖!呸!~ 我们都知道,Java是一门高级语言,它的运行环境JVM执行的是字节码

python学习之继承

走远了吗. 提交于 2020-04-04 09:44:35
class P(object): 'P class' def __init__(self): print('created an instance of',self.__class__.__name__) def foo(self): print('Hi,I am P-foo()')class C(P): def foo(self): P.foo(self) #子类的重写方法显式地调用基类方法 super(C,self).foo() #P.foo(self)等价super(C,self).foo()等价super().foo() super().foo() print('Hi,I am C-foo()')p=P()c=C()# print(p.__class__) # p所属的类名# print(P.__bases__) # 父类的父类# print(P.__doc__) # 父类的文档字符串# print('-'*50)# print(c.__class__) # c所属的类名# print(C.__bases__) # 子类的父类print('-'*50)# p.foo() #实例调用方法# c.foo() #子类调用基类的覆盖方法# P.foo(c) #调用未绑定的基类方法,把子类实例传参进去c.foo() 来源: https://www.cnblogs.com

前端学PHP之数据类型

两盒软妹~` 提交于 2020-03-29 02:45:03
前面的话   同javascript一样,php也是一门弱类型语言,或者说成类型松散的语言。在强类型语言中,变量要先指定类型,然后才可以对应指定类型的值。而php则不必告知变量的数据类型,会根据它的值,自动把变量转换成正确的数据类型。下面将详细介绍php的数据类型 总括   PHP数据类型包括8种:其中包括四种标量类型、两种复合类型和两种特殊类型。具体是:字符串、整数、浮点数、布尔、数组、对象、NULL、资源   如果想查看某个表达式的值和类型,可以使用函数var_dump() <?php $var = 1; //int 1 echo var_dump($var); echo '<br>'; $var = 1.0; //float 1 echo var_dump($var); echo '<br>'; $var = true; //boolean true echo var_dump($var); echo '<br>'; $var = '1'; //string '1' (length=1) echo var_dump($var); echo '<br>'; ?> 布尔型   布尔型是最简单的类型。boolean表达了真值,可以为TRUE或FALSE   要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写 <?php $foo = True; //

php数据类型

ⅰ亾dé卋堺 提交于 2020-03-29 02:44:26
总括   PHP数据类型包括8种:其中包括四种标量类型、两种复合类型和两种特殊类型。具体是:字符串、整数、浮点数、布尔、数组、对象、NULL、资源   如果想查看某个表达式的值和类型,可以使用函数var_dump() <?php $var = 1; //int 1 echo var_dump($var); echo '<br>'; $var = 1.0; //float 1 echo var_dump($var); echo '<br>'; $var = true; //boolean true echo var_dump($var); echo '<br>'; $var = '1'; //string '1' (length=1) echo var_dump($var); echo '<br>'; ?> 布尔型   布尔型是最简单的类型。boolean表达了真值,可以为TRUE或FALSE   要指定一个布尔值,使用关键字 TRUE 或 FALSE。两个都不区分大小写 <?php $foo = True; // assign the value TRUE to $foo ?> 转换   要明确地将一个值转换成 boolean,用 (bool) 或者 (boolean) 来强制转换 假值   当转换为boolean时,以下值被认为是 FALSE:   布尔值 FALSE 本身  

Python基础第20天

点点圈 提交于 2020-03-23 06:04:00
面向对象进阶 一: isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass f1=Foo() print(isinstance(f1,Foo)) 2. issubclass(sub, super)检查sub类是否是 super 类的派生类 class Foo: pass f1=Foo() print(isinstance(f1,Foo)) class Bar(Foo): pass b1=Bar() print(issubclass(Bar,Foo)) print(isinstance(b1,Foo)) print(type(b1)) #<class '__main__.Bar'> 二:getattribute class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print('执行的是getattr') def __getattribute__(self, item): print('执行的是getattribute') raise AttributeError('抛出异常了') f1=Foo(10) f1.xxxxx f1.x

JavaScript 中的陷阱

不问归期 提交于 2020-03-19 13:13:05
3 月,跳不动了?>>> 全局变量 JavaScript 通过函数管理作用域。在函数内部声明的变量只在这个函数内部,函数外面不可用。另一方面,全局变量就是在任何函数外面声明的或是未声明直接简单使用的。 “未声明直接简单使用”,指的是不用 var 关键字来声明变量。这个我们已经非常清楚,避免造成隐式产生全局变量的方法就是声明变量尽量用 var 关键字。 可你以为用了 var 就 ok 了?来看看这个陷进: 1 2 3 4 function foo ( ) { var a = b = 0 ; // body... } 也许你期望得到的是两个局部变量,但 b 却是货真价实的全局变量。why? Because 赋值运算是自右往左的 ,所以这相当于: 1 2 3 4 function foo ( ) { var a = ( b = 0 ) ; // body... } 所以 b 是全局变量。 解决:变量声明,最好一个个来,别搞批发~_~; 变量声明 先来看陷阱: 1 2 3 4 5 6 7 8 9 myName = "global" ; function foo ( ) { alert ( myName ) ; var myName = "local" ; alert ( myName ) ; } foo ( ) ; 乍看上去,我们预计期望两次 alert 的结果分别为 “global” 与