function fn () { var a = b = c = 1; } // var a = b = c = 1; => var a = ( b = ( c = 1 )); // b,c是全局变量 // 赋值是从右往左进行的,也就是说这一行先执行b=1 // 这时候b就是全局变量了,没有被var过。 // 然后是var a = b;
(function () { var a = b = 1; })(); console.log("a defined? " + (typeof a !== 'undefined')); console.log("b defined? " + (typeof b !== 'undefined'));
分析:a 和 b 都定义在自调用函数中,并且都是通过var关键字创建,
对于sj初学者来说,a 和 b 在函数内部,属于局部变量,所以 a 和 b 的数据类型为undefined。
这是因为初学者把var a = b = 1 ,错误的理解为以下语句:
var a = 1;
var b = 1;
很显然,这是错误的!实际还是哪个程序执行是自右向左的,实际解析情况如下:
b = 1; // var声明的是局部变量,若是不带var,变量默认是全局的。
var a = b;
因此(不在严格模式下),此段代码输出结果为:
a defined? false b defined? true
function test(x, y, z) { alert(test.length); alert(arguments.length); alert(arguments.callee === test); alert(arguments[2]); } test(10, 20); // 3 2 true undefined
var x = 30; function test() { alert(x); var x = 10; alert(x); x = 20; function x() { }; alert(x); } test(); // function x(){...} 10 20 // 进入函数作用域以后,函数声明 和 变量声明提升,而且函数名优先
"5" + { toString: function(){return this;}, valueOf: function(){return "valueOf";} } // "5valueOf"
ECMAScript262中规定,首先对"+"前后的两个表达式进行求值,即调用valueof方法。
再调用 typeof 对他们的类型进行判断,如果有一个类型为 string 的则都将转化为string。
不为 string 类型,调用 toString 方法。
所以后面的 对象 会被转化为string类型。
使用event.stopPropagation()起到阻止捕获和冒泡阶段中当前事件的进一步传播。
使用event.preventDefault()可以取消默认事件。
-
ev.type 获取当前事件名
-
ev.target 获取事件目标最最先触发事件的元素
鼠标事件对象:
-
事件对象.clientX / 事件对象.clientY
鼠标在浏览器可视区域中的坐标
-
事件对象.offsetX / 事件对象.offsetY
获取鼠标在指定的元素的区域中的坐标
-
事件对象.pageX / 事件对象.pageY
获取鼠标在整个文档区域中的坐标
键盘事件对象的属性:
-
事件对象.altKey
检测是否按下键盘上的 Alt键。 按下返回 true
-
事件对象.ctrlKey
检测是否按下键盘上的 Ctrl键。 按下返回 true
-
事件对象.shiftKey
检测是否按下键盘上的 Shift键。 按下返回 true
-
事件对象.keyCode
返回被敲击的键生成的 Unicode 字符码(ascii码),返回ascii码表对应的十进制的数字
获取本月天数
let date = new Date() let year = date.getFullYear() let month = date.getMonth() + 1 let d = new Date(year, month, 0) console.log(d.getDate())