学习笔记 2020-11-21
JavaScript 高级程序设计(第4版) 阅读记录
动画与 Canvas 图形
2D 绘图上下文
绘制矩形
- fillRect()
- strokeRect()
- clearRect()
以上方法接收 4 个参数,矩形 x 坐标, y 坐标,矩形宽度和矩形高度。
- lineWidth
- lineCap
绘制路径
- beginPath()
- arc(x, y, radius, startAngle, endAngle, counterclockwise)
- arcTo(x1, y1, x2, y2, radius)
- bezierCurveTo(c1x, c1y, c2x, c2y, x, y)
- lineTo(x, y)
- moveTo(x, y)
- quadraticCurveTo(cx, cy, x, y)
- rect(x, y, width, height)
- isPointInPath(x, y)
绘制文本
- fillText()
- strokeText()
parameter: string, x, y, pxWidth
- font
- textAlign
- textBaseLine
- measureText()
变换
- rotate(angle)
- scale(scaleX, scaleY)
- translate(x, y)
- transform(m1_1, m1_2, m2_1, m2_2, dx, dy)
- setTransform(m1_1, m1_2, m2_1, m2_2, dx, dy)
- save()
- restore()
绘制图像
- drawImage()
阴影
- shadowColor
- shadowOffsetX
- shadowOffsetY
- shadowBlur
渐变
- createLinearGradient(x1, y1, x2, y2)
- addColorStop(position, color)
现代 JavaScript 教程
函数绑定
任务
作为方法的绑定函数
输出将会是什么?
function f() { alert( this ); // ? } let user = { g: f.bind(null) }; user.g();
null。
二次 bind
我们可以通过额外的绑定改变
this
吗?输出将会是什么?
function f() { alert(this.name); } f = f.bind( {name: "John"} ).bind( {name: "Ann" } ); f();
John。一个函数不能被重绑定。
bind 后的函数属性
函数的属性中有一个值。
bind
之后它会改变吗?为什么,阐述一下?function sayHi() { alert( this.name ); } sayHi.test = 5; let bound = sayHi.bind({ name: "John" }); alert( bound.test ); // 输出将会是什么?为什么?
undefined
。修复丢失了 “this” 的函数
下面代码中对
askPassword()
的调用将会检查 password,然后基于结果调用user.loginOk/loginFail
。但是它导致了一个错误。为什么?
修改高亮的行,以使所有内容都能正常工作(其它行不用修改)。
function askPassword(ok, fail) { let password = prompt("Password?", ''); if (password == "rockstar") ok(); else fail(); } let user = { name: 'John', loginOk() { alert(`${this.name} logged in`); }, loginFail() { alert(`${this.name} failed to log in`); }, }; askPassword(user.loginOk, user.loginFail); // 此行高亮
askPassword(user.loginOk.bind(user), user.loginFail.bind(user));
偏函数在登陆中的应用
这个任务是比 修复丢失了 “this” 的函数 略微复杂的变体。
user
对象被修改了。现在不是两个函数loginOk/loginFail
,现在只有一个函数user.login(true/false)
。在下面的代码中,我们应该向
askPassword
传入什么参数,以使得user.login(true)
结果是ok
,user.login(fasle)
结果是fail
?function askPassword(ok, fail) { let password = prompt("Password?", ''); if (password == "rockstar") ok(); else fail(); } let user = { name: 'John', login(result) { alert( this.name + (result ? ' logged in' : ' failed to log in') ); } }; askPassword(?, ?); // ?
你只能修改高亮部分的代码。
askPassword(user.login.bind(user, true), user.login.bind(user, false));