函数声明和函数表达式
函数声明必须带有标示符(Identifier)(就是大家常说的函数名称),而函数表达式则可以省略这个标示符.
因而如果不声明函数名称,它肯定是表达式; 如果声明了函数名称时, ECMAScript是通过上下文来区分的,如果function foo(){}是作为赋值表达式的一部分的话,那它就是一个函数表达式,如果function foo(){}被包含在一个函数体内,或者位于程序的最顶部的话,那它就是一个函数声明。
function foo(){} // 声明,因为它是程序的一部分
var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分
new function bar(){}; // 表达式,因为它是new表达式
(function(){
function bar(){} // 声明,因为它是函数体的一部分
})();
还有一种函数表达式不太常见,就是被括号括住的(function foo(){}),他是表达式的原因是因为括号 ()是一个分组操作符,它的内部只能包含表达式.
function foo(){} // 函数声明
(function foo(){}); // 函数表达式:包含在分组操作符内
try {
(var x = 5); // 分组操作符,只能包含表达式而不能包含语句:这里的var就是语句
} catch(err) {
// SyntaxError
}
除了(), 还可以通过在函数声明外面添加~, !, -, +等运算符将函数声明转化成函数表达式. 下面这些都不会报错, 并且立即执行弹出提示框alert.
(function () {alert(1)})();
(function () {alert(1)}());
!function () {alert(1)}();
-function () {alert(1)}();
~function () {alert(1)}();
+function () {alert(1)}();
获取有class="hide"的元素高,宽是值为0
$("#manually-topo-preview").width(); // 0, 因为有class=hide属性
复制js对象
js中复制分为深度复制和浅度复制, 深度复制出来的对象和原来对象没有任何关系, 对复制对象的操作不会影响原对象; 浅度复制出来的对象实际上和原来的对象是一个东西, 对复制对象的操作同样会在原有对象上体现.
- 浅度复制
var copy = $.extend({}, origin)
- 深度复制
var dcopy = $.extend(true, {}, origin)
日期时间操作
// 获取当前时间
now = new Date()
// 获取当前时间的年,月(范围0-11),日
now.getYear(); now.getMonth() + 1; now.getDate();
// 获取之前n的时间
previous = new Date()
previous.setDate(now.getDate() - n)
正则表达式
// 正则表达式是放在//中
/bc/,匹配bc
异常处理机制
result = 0;
try{
$.ajax({
url: '/home/data/',
type: 'GET',
dataType: 'json',
success: function(data){
result = data.result;
},
})
}catch(exception e){
alert('failed to get data from backend');
}finally{
alert(result);
}