超级超级好玩的东西: eval 与new Function的用法

网上看到的,太丑陋了new Function可以参考参考:

var aa = "{name:'cola',item:[{age:11},{age:22},{age:23},{age:23}]}"; 
    var now = new Date().getTime(); 
    for (var i = 0; i < 100000; i++) { 
        var a = eval("(" + aa + ")"); 
    } 
    var now1 = new Date().getTime(); 
    document.write("eval 时间为:" + (now1 - now) + "<br/>"); 
var now2 = new Date().getTime(); 
    for (var i = 0; i < 100000; i++) { 
        var fn = new Function("return" + aa); 
        fn(); 
    } 
    var now3 = new Date().getTime(); 
    document.write("new Function时间为:" + (now3 - now2) + "<br/>"); 
//经过测试结果 FF效果如下
        //eval 时间为:979
        //new Function时间为:1372
        //经过测试结果 IE8效果如下 
        //eval 时间为:913
        //new Function时间为:1037
        //经过测试结果 Chrome效果如下
        //eval 时间为:211
        //new Function时间为:251
        //经过测试结果 Opera
        //eval 时间为:384
        //new Function时间为:1024

项目中写的代码:

<template>
  <div class="app-container calendar-list-container">
    <div class="filter-container">
      <el-select class="filter-item" v-model="paramsName" placeholder="分类">
        <el-option v-for="item in colConfigs[colMap]" :key="item.prop" :label="item.label" :value="item.prop">
        </el-option>
      </el-select>
      <el-input @keyup.enter.native="handleFilter" style="width: 200px;" class="filter-item" placeholder="关键字" v-model="paramsValue"> </el-input>
      <el-button class="filter-item" type="primary" icon="search" @click="handleFilter">搜索</el-button>
      <el-button class="filter-item" v-if="true||btn_add" @click="handleCreate" type="primary" icon="edit">添加</el-button>
    </div>
    <el-table :data="list" v-loading.body="listLoading" height=420 border fit highlight-current-row style="width: 100%;">
      <el-table-column align="center" width="180"
        v-for="{ prop, label } in colConfigs[colMap]"
        :key="prop"
        :prop="prop"
        :label="label">
      </el-table-column>
      <el-table-column fixed="right" align="center" label="操作" width="360"> 
        <template slot-scope="scope">
          <el-button v-if="colMap!==colOptions[2]" type="primary" size="small" @click="clickNext(scope.row)">{{ colCN[colMap].next }}</el-button>
          <el-button v-if="colMap!==colOptions[0]" type="primary" size="small" @click="clickPrev()">上一步</el-button>
          <el-button v-if="true||btn_edit" type="success" size="small" @click="handleUpdate(scope.row)">编辑</el-button>
          <el-button v-if="true||btn_del" type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
        </template>
      </el-table-column>
    </el-table>
    <div v-show="!listLoading" class="pagination-container">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page.sync="listQuery.page" :page-sizes="[10,20,30, 50]" :page-size="listQuery.limit" layout="total, sizes, prev, pager, next, jumper" :total="total"> </el-pagination>
    </div>
    <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible">
      <el-form :model="eval(colMap+'Form')" :rules="rules" ref="form" label-width="200px" size="mini">
        <el-form-item v-for="({ prop, label },index) in colConfigs[colMap]" :label="label" prop="prop" :key="prop">
          <el-input :model="eval(colMap+'Form['+prop+']')" :disabled="(dialogStatus=='create')?(index<colConfigs[colMap].length-2):(index<colConfigs[colMap].length-1)" :placeholder="'请输入'+label"></el-input>
        </el-form-item>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="cancel('form')">取 消</el-button>
        <el-button v-if="dialogStatus=='create'" type="primary" @click="create('form')">确 定</el-button>
        <el-button v-else type="primary" @click="update('form')">确 定</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
/* eslint-disable */
import {
  regionList, cityList, districtList,
  addRegion, addCity, addDistrict,
  getRegion, getcity, getDistrict,
  delRegion, delCity, delDistrict,
  putRegion, putCity, putDistrict } from '@/api/admin/region/index';
import { mapGetters } from 'vuex';
export default {
  name: 'region',
  data() {
    return {
      regionForm: { regionCode: '', regionName: '' },
      cityForm: { regionCode: '', cityCode: '', cityName: '' },
      districtForm: { regionCode: '', cityCode: '', districtCode: '', districtName: '' },
      colMap: '',
      colOptions: ['Region', 'City', 'District'],
      colCN: { region: { next: '城市' }, city: { next: '区/县' } },
      colConfigs: {
        region: [
          { prop: 'regionCode', label: '省编码' },
          { prop: 'regionName', label: '省名称' }
        ],
        city: [
          { prop: 'regionCode', label: '省编码' },
          { prop: 'cityCode', label: '城市编码' },
          { prop: 'cityName', label: '城市名称' }
        ],
        district: [
          { prop: 'regionCode', label: '省编码' },
          { prop: 'cityCode', label: '城市编码' },
          { prop: 'districtCode', label: '区/县编码' },
          { prop: 'districtName', label: '区/县名称' }
        ]
      },
      rules: {
      },
      list: null,
      total: null,
      listLoading: true,
      listQuery: {
        page: 1,
        limit: 20,
        regionCode: '',
        cityCode: ''
      },
      rowRegionCode: '',
      rowCityCode: '',
      dialogFormVisible: false,
      dialogStatus: '',
      btn_edit: false,
      btn_del: false,
      btn_add: false,
      paramsValue: undefined,
      paramsName: undefined,
      inputText: true,
      textMap: {
        update: '编辑',
        create: '创建'
      }
    };
  },
  created() {
    this.colMap = this.colOptions[0];
    this.getList();
    this.btn_edit = this.elements['regionManager:btn_edit'];
    this.btn_del = this.elements['regionManager:btn_del'];
    this.btn_add = this.elements['regionManager:btn_add'];
  },
  computed: {
    ...mapGetters(['elements'])
  },
  methods: {
    clickNext(row) {
      eval('this.colMap = ' + (this.colMap === this.colOptions[0]) ? this.colOptions[1] : this.colOptions[2]);
      eval('this.row' + this.colMap + 'Code = row.' + this.colMap + 'Code');
      this.resetQueryParams();
      this.getList();
    },
    clickPrev() {
      eval('this.colMap = ' + (this.colMap === this.colOptions[1]) ? this.colOptions[0] : this.colOptions[1]);
      eval('this.row' + this.colMap + 'Code = \'\'');
      this.resetQueryParams();
      this.getList();
    },
    getList() {
      this.resetListQuery();
      this.listLoading = true;
      switch (this.colMap) {
        case this.colOptions[0]:
          regionList(this.listQuery).then(response => {
            this.list = response;
            this.total = response.length;
            this.listLoading = false;
          });
          break;
        case this.colOptions[1]:
          cityList(this.listQuery).then(response => {
            this.list = response;
            this.total = response.length;
            this.listLoading = false;
          });
          break;
        case this.colOptions[2]:
          districtList(this.listQuery).then(response => {
            this.list = response;
            this.total = response.length;
            this.listLoading = false;
          });
          break;
      }
    },
    handleFilter() {
      this.getList();
    },
    handleSizeChange(val) {
      this.listQuery.limit = val;
      this.getList();
    },
    handleCurrentChange(val) {
      this.listQuery.page = val;
      this.getList();
    },
    handleCreate() {
      this.resetTemp();
      this.dialogStatus = 'create';
      this.dialogFormVisible = true;
    },
    handleUpdate(row) {
      this.resetTemp();
      let getObj = eval("get"+this.colMap);
      let rowId = eval("row."+ this.colMap.toLowerCase() +"Code");
      getObj(rowId).then(response => {
        this.form = response.data;
        this.dialogFormVisible = true;
        this.dialogStatus = 'update';
      });
    },
    handleDelete(row) {
      this.$confirm('此操作将永久删除, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        let delObj = eval("del"+this.colMap);
        let rowId = eval("row."+ this.colMap.toLowerCase() +"Code");
        delObj(rowId).then(() => {
          this.$notify({
            title: '成功',
            message: '删除成功',
            type: 'success',
            duration: 2000
          });
          const index = this.list.indexOf(row);
          this.list.splice(index, 1);
        });
      });
    },
    create(formName) {
      const set = this.$refs;
      set[formName].validate(valid => {
        if (valid) {
          let addObj = eval("add"+this.colMap);
          let addForm = eval("this."+ this.colMap.toLowerCase() +"Form");
          addObj(addForm).then(() => {
            this.dialogFormVisible = false;
            this.getList();
            this.$notify({
              title: '成功',
              message: '创建成功',
              type: 'success',
              duration: 2000
            });
          });
        } else {
          return false;
        }
      });
    },
    cancel(formName) {
      this.dialogFormVisible = false;
      const set = this.$refs;
      set[formName].resetFields();
    },
    update(formName) {
      const set = this.$refs;
      set[formName].validate(valid => {
        if (valid) {
          this.dialogFormVisible = false;
          this.form.password = undefined;
          let putObj = eval("put"+this.colMap);
          let objId = eval("this."+this.colMap.toLowerCase()+"Form."+this.colMap.toLowerCase()+"Code");
          let objForm = eval("this."+this.colMap.toLowerCase()+"Form");
          putObj(objId, objForm).then(() => {
            this.dialogFormVisible = false;
            this.getList();
            this.$notify({
              title: '成功',
              message: '创建成功',
              type: 'success',
              duration: 2000
            });
          });
        } else {
          return false;
        }
      });
    },
    resetTemp() {
      switch (this.colMap) {
        case this.colOptions[0]:
          this.regionForm = { regionCode: '', regionName: '' };
          break;
        case this.colOptions[1]:
          this.cityForm = { regionCode: this.rowRegionCode, cityCode: '', cityName: '' };
          break;
        case this.colOptions[2]:
          this.districtForm = { regionCode: this.rowRegionCode, cityCode: this.rowCityCode, districtCode: '', districtName: '' };
          break;
      }
    },
    resetListQuery() {
      this.listQuery = {
        page: 1,
        limit: 20,
        regionCode: this.rowRegionCode,
        cityCode: this.rowCityCode
      }
      this.listQuery[this.paramsName] = this.paramsValue;
    },
    resetQueryParams() {
      this.paramsName = '';
      this.paramsValue = '';
    }
  }
};
</script>

附上赵偶像和阮偶像的连接

  http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

http://blog.zhaojie.me/2012/08/js-code-from-eval-benchmark.html

猜你喜欢

转载自www.cnblogs.com/tabCtrlShift/p/9175836.html
今日推荐